题解 | #【模板】拓扑排序#
【模板】拓扑排序
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)

查看1道真题和解析