canuc80k5008·9/50

Đường Đi Có Hướng Nhỏ Nhất

Nộp bài trên LQDOJ

Bài 50 · Eulerian Path

Cho một đa đồ thị có hướng gồm đỉnh và cung. Hãy đi qua mỗi cung đúng một lần.

Nếu có nhiều đường đi hợp lệ, cần in dãy đỉnh nhỏ nhất theo thứ tự từ điển. Hai dãy được so sánh tại vị trí đầu tiên mà chúng khác nhau.

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 nhãn đỉnh của đường đi nhỏ nhất theo thứ tự từ điển trên một dòng.
  • Nếu không tồn tại, in No.

Constraints

  • .
  • .
  • Mỗi cung có và trong đoạn từ đến .
  • Đồ thị nhận được khi bỏ hướng của mọi cung là liên thông trên toàn bộ đỉnh.
  • Có thể có cung song song và cung tự quay.

Scoring

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

Example

Test 1

Input

4 5
1 2
1 3
2 1
3 4
4 1

Output

1 2 1 3 4 1

Giải thích: Dãy dùng đủ năm cung. Sau tiền tố bắt đầu ở , chọn đích trước làm dãy nhỏ hơn theo thứ tự từ điển.

Lời giải tóm tắt
  • Mô hình: Mỗi cung có hướng là một cạnh cần dùng đúng một lần. Bán bậc vào/ra quyết định đỉnh bắt đầu, còn thứ tự các đích quyết định thứ tự từ điển.
  • Thuật toán: Kiểm tra chênh lệch out-in. Chọn đỉnh bắt đầu bắt buộc nếu đường đi mở, nếu là chu trình chọn đỉnh nhỏ nhất có cung ra; sắp các đích và chạy Hierholzer lấy đích nhỏ nhất.
  • Chứng minh đúng: Một đường đi mở có đúng một đỉnh thừa một cung ra và một đỉnh thừa một cung vào; chu trình có mọi đỉnh cân bằng. Hierholzer dùng mỗi cung đúng một lần. Sắp đích tăng dần và xử lý theo thứ tự đó tạo dãy nhỏ nhất tại vị trí khác nhau đầu tiên.
  • Độ phức tạp: Thời gian: O(m log m). Bộ nhớ nằm trong cùng bậc với cấu trúc đồ thị hoặc số trạng thái được lưu.
  • Lỗi thường gặp: lấy đích lớn nhất trước.
  • Lỗi thường gặp: bỏ qua đỉnh thừa cung ra và bắt đầu ở đỉnh nhỏ nhất có cung.
  • Lỗi thường gặp: chỉ chấp nhận đường đi mở và bác bỏ chu trình Euler.