canuc80k5004·5/50

Từ Một Đến Đích Qua Mọi Cung

Nộp bài trên LQDOJ

Bài 50 · Eulerian Path

Cho một đa đồ thị có hướng. Bạn bắt đầu tại đỉnh , phải đi qua mỗi cung đúng một lần và kết thúc tại đỉnh . Hãy dựng một đường đi như vậy.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi trong dòng tiếp theo chứa hai số và , biểu diễn một cung đi từ đến .

Output

  • Nếu tồn tại, in số là các đỉnh theo thứ tự của một đường đi hợp lệ. Dãy phải bắt đầu tại và kết thúc tại .
  • Nếu không tồn tại, in IMPOSSIBLE.

Constraints

  • Mỗi cung đi từ một đỉnh đến một đỉnh khác trong đoạn từ đến .
  • Có thể có nhiều cung cùng hướng giữa một cặp đỉnh.

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4 3
1 2
2 3
3 4

Output

1 2 3 4

Giải thích: Dãy lần lượt dùng ba cung và kết thúc tại .

Lời giải tóm tắt
  • Mô hình: Mỗi cổng là một cung có ID riêng, nên bán bậc vào và bán bậc ra phải được xét riêng.
  • Thuật toán: Kiểm tra chênh lệch in/out tại 1, n và các đỉnh giữa; chạy Hierholzer có hướng từ 1 và yêu cầu dãy dài m+1 kết thúc tại n.
  • Chứng minh đúng: Trên đường đi từ 1 đến n, đỉnh 1 thừa một lần đi ra, n thừa một lần đi vào, còn mọi đỉnh giữa cân bằng. Hierholzer dùng mỗi ID cung một lần; kiểm tra kích thước m+1 loại bỏ các thành phần cung không thể đạt từ 1.
  • Độ phức tạp: Thời gian O(n+m); bộ nhớ tuyến tính theo số đỉnh và số cạnh/cung.