cpp-037Đọc toàn bộ đề miễn phí

Chu trình Euler và thuật toán Hierholzer trên đồ thị có hướng

Hệ thống mạng máy chủ của AI Empire Academy gồm N trạm máy chủ (1 ≤ N ≤ 105) và M tuyến cáp quang một chiều (1 ≤ M ≤ 2 · 105). Đồ thị có thể có đa cạnh.

C++Nâng cao45 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

graphseulerian circuithierholzer algorithmdfs

Kiến thức tiên quyết: graph representation, in out degree, std vector.

Nội dung đề bài

Mục tiêu kiến thức

  • Hiểu định lý Euler cho đồ thị có hướng: Tồn tại chu trình Euler khi và chỉ khi với mọi đỉnh, bán bậc vào bằng bán bậc ra (in_degree[u] == out_degree[u]) và tất cả các cạnh thuộc cùng một thành phần liên thông.
  • Cài đặt thuật toán Hierholzer để khôi phục thứ tự các đỉnh trong chu trình trong thời gian tuyến tính O(V + E).
  • Tối ưu hóa con trỏ cạnh hiện tại (head[u]) để không duyệt lại các cạnh đã bị loại bỏ.

Mô tả bài toán

Hệ thống mạng máy chủ của AI Empire Academy gồm N trạm máy chủ (1 ≤ N ≤ 105) và M tuyến cáp quang một chiều (1 ≤ M ≤ 2 · 105). Đồ thị có thể có đa cạnh.

Robot bảo trì xuất phát từ trạm 1, cần đi tuần tra qua tất cả M tuyến cáp quang đúng một lần và quay trở về trạm 1.

Hãy tìm một chu trình Euler như vậy. Nếu không tồn tại chu trình Euler xuất phát từ trạm 1, in -1.

Quy ước nộp bài

  • Chỉ cần viết một chương trình đọc stdin và in ra stdout. Bài này không yêu cầu viết hàm.
  • Không dùng cout để in lời nhắc trước khi đọc dữ liệu. Lời nhắc sẽ lọt vào stdout và làm bài sai.
  • Chỉ in đúng nội dung ở mục Output. Không in thêm nhãn, dòng trống hay ký tự thừa.
  • Output được so khớp từng ký tự, phân biệt chữ hoa/thường và dấu câu.

Input

  • Dòng 1: Gồm 2 số nguyên N và M (1 ≤ N ≤ 105, 1 ≤ M ≤ 2 · 105).
  • M dòng tiếp theo: Mỗi dòng gồm 2 số nguyên u, v (1 ≤ u, v ≤ N) thể hiện tuyến cáp một chiều từ u đến v.

Output

  • Nếu tồn tại chu trình Euler: In ra trên một dòng M + 1 số nguyên là danh sách các đỉnh theo thứ tự đi qua trong chu trình (bắt đầu và kết thúc tại đỉnh 1).
  • Nếu không tồn tại: In -1.

Ràng buộc

  • 1 ≤ N ≤ 105.
  • 1 ≤ M ≤ 2 · 105.
  • Thời gian chạy: 1000ms.
  • Bộ nhớ tối đa: 256MB.

Ví dụ 1

Input

3 3
1 2
2 3
3 1

Output

1 2 3 1

Ví dụ 2

Input

3 2
1 2
2 3

Output

-1
*Giải thích:* Bán bậc vào của đỉnh 1 là 0, bán bậc ra là 1 ($in \ne out$), không thể quay về đỉnh 1 sau khi đi hết các cạnh.
3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.