题解 | #【模板】拓扑排序#
【模板】拓扑排序
https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c
n,m = map(int,input().split()) k = n if n > m else m head = [0] * (k + 1) # 要设置点数和边数中更大的一个 next = [0] * (k + 1) to_ = [0] * (k + 1) cnt = 1 in_degree = [0] * (n+1) # 要设置正确的点数 import collections for _ in range(m): lst = list(map(int,input().split())) next[cnt] = head[lst[0]] # 当前边的下一条边号 to_[cnt] = lst[1] # 下一条边去到的点 head[lst[0]] = cnt # 当前点号的下一条边号 cnt += 1 in_degree[lst[1]] += 1 queue = collections.deque() for i in range(len(in_degree)): if i == 0: continue if in_degree[i] == 0: queue.appendleft(i) # print(queue) res = [] while queue: cur = queue.pop() res.append(cur) cur_edge = head[cur] while cur_edge != 0: # 遍历 in_degree[to_[cur_edge]] -= 1 if in_degree[to_[cur_edge]] == 0: queue.appendleft(to_[cur_edge]) cur_edge = next[cur_edge] ans = ' '.join(map(str,res)) print(ans if len(res) == n else -1)