used = [False] * n # 使用済みの頂点を管理
order = [] # トポロジカル順序
def dfs(v): # dfs
used[v] = True # 頂点 v を訪問済みにする
for to in g[v]: # v から到達できる各頂点 to に対して
if not used[to]: # 訪問していないなら
dfs(to) # 再帰的に dfs を呼び出す
order.append(v) # v をトポロジカル順序リストに追加
for i in range(n): # すべての頂点について
if not used[i]: # 訪問していない頂点があれば
dfs(i) # その頂点から dfs を開始
print(*order[::-1]) # トポロジカルオーダーを出力
チャレンジ: コーススケジュールを組み立てる
あなたが履修したいコースは n 個あり、それぞれのコースには合計で p 個の事前履修条件があります。各条件は のペアで表され、これは「コース を履修する前にコース を先に取らなければならない」ことを意味します。(たとえば、(1, 2) というペアなら、コース 1 を取るより先にコース 2 を修了しなければならないということです。)
すべてのコースを修了できるかどうかを判定してください。
入力
最初の行には、整数 n と p が空白区切りで与えられます (1 ≤ n, p ≤ 10 000)。