Hướng dẫn giải của BÀI 2: TÌM THỨ TỰ TÔ-PÔ (TOPOSORT)
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
1. Thuật toán Kahn (BFS với Bậc vào - In-degree)
- Tính bán bậc vào (In-degree): Với mỗi đỉnh ~u~, đếm số cung đi vào ~u~, lưu vào
in_degree[u]. - Khởi tạo hàng đợi: Đẩy tất cả các đỉnh có
in_degree[u] == 0vào một hàng đợi (Queue). - Duyệt BFS:
- Lấy đỉnh ~u~ ra khỏi hàng đợi, thêm ~u~ vào danh sách kết quả thứ tự tô-pô.
- Với mỗi cung ~u \to v~, giảm bậc vào của ~v~:
in_degree[v]--. - Nếu
in_degree[v] == 0, đẩy ~v~ vào hàng đợi.
- Kiểm tra chu trình:
- Nếu số lượng đỉnh trong danh sách kết quả đúng bằng ~N~, ta thu được một thứ tự tô-pô hợp lệ.
- Nếu số lượng đỉnh nhỏ hơn ~N~, đồ thị chứa ít nhất một chu trình có hướng ~\to~ in ra
-1.
2. Độ phức tạp
- Thời gian: ~\mathcal{O}(N + M)~ - tối ưu tuyệt đối.
- Bộ nhớ: ~\mathcal{O}(N + M)~.
Bình luận