canuc80k5003·4/50

Hành Trình Qua Mọi Cạnh

Nộp bài trên LQDOJ

Bài 50 · Eulerian Path

Cho một đa đồ thị vô hướng. Bạn bắt đầu tại đỉnh , phải đi qua mỗi cạnh đúng một lần và cuối cùng trở lại đỉnh . Hãy dựng một hành trình 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 đầu mút của một cạnh vô hướng.

Output

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

Constraints

  • Mỗi cạnh nối hai đỉnh khác nhau trong đoạn từ đến .
  • Có thể có nhiều cạnh nối cùng 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 4
1 2
2 3
3 4
4 1

Output

1 2 3 4 1

Giải thích: Dãy đi qua đúng bốn cạnh đã cho và quay lại đỉnh .

Lời giải tóm tắt
  • Mô hình: Mỗi đường là một cạnh có ID riêng; các cạnh song song không được gộp.
  • Thuật toán: Hierholzer lặp với ID cạnh, bắt đầu tại 1; sau cùng yêu cầu mọi bậc chẵn và dãy có đúng m+1 đỉnh.
  • Chứng minh đúng: Hierholzer đánh dấu mỗi ID cạnh đúng một lần. Khi không còn cạnh ở đỉnh trên stack, đỉnh ấy được đưa vào kết quả; đảo dãy thu được một chu trình. Dãy có m+1 đỉnh chứng minh mọi cạnh đã được sử dụng.
  • Độ phức tạp: Thời gian O(n+m); bộ nhớ tuyến tính theo số đỉnh và số cạnh/cung.