python-020Đọc toàn bộ đề miễn phí

Phát hiện phụ thuộc vòng bằng Topological Sort

Chương trình đào tạo tại AI Empire Academy bao gồm num\_courses khóa học được đánh số từ 0 đến num\_courses - 1. Một số khóa học có yêu cầu tiên quyết: để học khóa u, học viên phải…

PythonNâng cao25 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 sortkahns algorithmcycle detection

Kiến thức tiên quyết: directed graphs, queue, in degree.

Nội dung đề bài

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

  • Thuật toán Kahn (Sắp xếp Tô-pô dựa trên bán bậc vào In-degree và Hàng đợi).
  • Phát hiện chu trình trong đồ thị có hướng (Directed Cycle Detection).
  • Áp dụng kiểm tra Deadlock / Vòng lặp phụ thuộc trong các pipeline phần mềm.

Mô tả bài toán

Chương trình đào tạo tại AI Empire Academy bao gồm num_courses khóa học được đánh số từ 0 đến num_courses - 1. Một số khóa học có yêu cầu tiên quyết: để học khóa u, học viên phải hoàn thành khóa v trước, ký hiệu bằng cặp (u, v) trong danh sách prerequisites.

Hãy viết hàm can_finish_courses(num_courses: int, prerequisites: list[tuple[int, int]]) -> bool xác định xem học viên có thể hoàn thành toàn bộ các khóa học hay không (tức là không tồn tại bất kỳ vòng phụ thuộc luẩn quẩn nào như A yêu cầu B, B lại yêu cầu A).

Thuật toán Kahn:

  • Đếm bán bậc vào (in_degree) của từng môn học.
  • Đưa tất cả các môn học có in_degree == 0 (không có điều kiện tiên quyết) vào hàng đợi.
  • Liên tục lấy một môn ra khỏi hàng đợi, tăng số môn hoàn thành lên 1, và giảm in_degree của các môn phụ thuộc vào nó. Nếu môn nào giảm về 0 thì đưa vào hàng đợi.
  • Nếu tổng số môn hoàn thành đúng bằng num_courses, trả về True; ngược lại (còn chu trình bế tắc), trả về False.

Input

  • num_courses: Số nguyên dương đại diện tổng số môn học.
  • prerequisites: Danh sách các cặp (u, v) thể hiện môn v là tiên quyết của u (v → u).

Output

Trả về giá trị boolean True hoặc False.

Ràng buộc

  • 1 ≤ num_courses ≤ 2000.
  • 0 ≤ len(prerequisites) ≤ 5000.
  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.

Ví dụ 1

Input

`num_courses = 2, prerequisites = [(1, 0)]`

Output

`True`

Giải thích

Học viên học môn 0 trước, sau đó học môn 1 ⇒ Hoàn thành được.

Ví dụ 2

Input

`num_courses = 2, prerequisites = [(1, 0), (0, 1)]`

Output

`False`

Giải thích

Môn 1 yêu cầu môn 0, môn 0 lại yêu cầu môn 1 ⇒ Bế tắc vòng (Deadlock), không thể hoàn thà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.