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

Sắp xếp Tô-pô bằng thuật toán Kahn và phát hiện chu trình

Hệ thống xử lý phân tán của AI Empire Academy cần lập lịch thực thi N tác vụ được đánh số từ 1 đến N (1 ≤ N ≤ 105). Có M ràng buộc phụ thuộc (0 ≤ M ≤ 2 · 105), mỗi rà…

C++Nâng cao35 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ủ đề

graphstopological sortdagbfspriority queue

Kiến thức tiên quyết: graph representation, std priority queue, std vector.

Nội dung đề bài

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

  • Hiểu định nghĩa Thứ tự Tô-pô (Topological Sort) trên Đồ thị có hướng không chu trình (DAG - Directed Acyclic Graph).
  • Cài đặt thuật toán Kahn (BFS dựa trên bán bậc vào in-degree).
  • Phát hiện chu trình (Cycle Detection): Nếu sau khi duyệt số đỉnh được gán nhãn nhỏ hơn N, đồ thị có chu trình.
  • Áp dụng Min-Heap (std::priority_queue với std::greater) để tìm thứ tự tô-pô có thứ tự từ điển nhỏ nhất (Lexicographically Smallest Topological Sort).

Mô tả bài toán

Hệ thống xử lý phân tán của AI Empire Academy cần lập lịch thực thi N tác vụ được đánh số từ 1 đến N (1 ≤ N ≤ 105). Có M ràng buộc phụ thuộc (0 ≤ M ≤ 2 · 105), mỗi ràng buộc dạng u → v có nghĩa là tác vụ u bắt buộc phải hoàn thành trước khi tác vụ v được phép bắt đầu.

Hãy tìm một thứ tự thực thi hợp lệ cho tất cả N tác vụ sao cho:

  • Thỏa mãn toàn bộ M ràng buộc phụ thuộc.
  • Nếu có nhiều thứ tự hợp lệ, hãy chọn thứ tự có thứ tự từ điển nhỏ nhất (tại mỗi bước, ưu tiên chọn tác vụ có số hiệu nhỏ nhất trong số các tác vụ đã sẵn sàng).
  • Nếu tồn tại chu trình phụ thuộc (bế tắc luẩn quẩn, không thể hoàn thành tất cả các tác vụ), hãy in ra -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, 0 ≤ 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, u ≠ v) đại diện cho ràng buộc u phải chạy trước v.

Output

  • Nếu tồn tại thứ tự hợp lệ: In trên một dòng gồm N số nguyên cách nhau bởi dấu cách.
  • Nếu tồn tại chu trình (không có thứ tự hợp lệ): In -1.

Ràng buộc

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

Ví dụ 1

Input

5 4
1 2
2 3
1 3
1 5

Output

1 2 3 4 5

Giải thích

  • Đỉnh 1 và đỉnh 4 có bán bậc vào bằng 0. Do ưu tiên từ điển nhỏ nhất, đỉnh 1 được chọn trước.
  • Sau khi xong 1, các đỉnh sẵn sàng tiếp theo được chọn lần lượt để có thứ tự nhỏ nhất là: 1 2 3 4 5.

Ví dụ 2

Input

3 3
1 2
2 3
3 1

Output

-1

Giải thích

Có chu trình phụ thuộc 1 → 2 → 3 → 1, không thể lập lịch được → in -1.

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.