from heapq import heapify, heappush, heappop def thu_tu(hoc_phan, canh): bac = dict.fromkeys(hoc_phan, 0) ke = {mon: [] for mon in bac} for truoc, sau in canh: ke[truoc].append(sau) bac[sau] += 1 cho = [mon for mon in bac if bac[mon] == 0] heapify(cho) ket_qua = [] while cho: mon = heappop(cho) ket_qua.append(mon) for sau in ke[mon]: bac[sau] -= 1 if bac[sau] == 0: heappush(cho, sau) if len(ket_qua) != len(bac): raise ValueError("Có chu trình tiên quyết") return ket_qua canh = [("A", "C"), ("B", "C"), ("C", "D")] assert thu_tu("DCBA", canh) == list("ABCD") try: thu_tu("ABCD", canh + [("D", "A")]) except ValueError: print("ABCD hợp lệ. Thêm D → A tạo chu trình.") else: raise AssertionError("Phải phát hiện chu trình")