题解 | #【模板】拓扑排序#
【模板】拓扑排序
https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c
from collections import defaultdict # 拓扑排序的基本思想是,先找到图中入度为 0 的节点,将其加入拓扑序列中,并移除该节点及其出边。然后更新剩余节点的入度,重复上述过程,直到所有节点都被加入到拓扑序列中或者图中不存在入度为 0 的节点 # 出度(Out-Degree):指的是从某个节点出发,指向其他节点的有向边的数量。换句话说,出度表示一个节点的直接后继节点的数量。 # 入度(In-Degree):指的是指向某个节点的有向边的数量。换句话说,入度表示一个节点的直接前驱节点的数量。 from collections import defaultdict m,n=map(int,input().split()) #使用了一个字典表示图的邻接关系,其中键是节点,值是该节点指向的其他节点列表 g=defaultdict(list) degree=defaultdict(int) for i in range(n): start,end=map(int,input().split()) g[start].append(end) s=[]#入度0的节点 for node in g: for c_node in g[node]: degree[c_node]+=1 for node in g: if degree[node]==0: s.append(node) res=[]#拓扑序 #添加进res一个,删除s中一个,入度0的节点序列为空时终止 while s: node1=s.pop() res.append(node1) #更新其他节点入度 for i in g[node1]: degree[i]-=1 #更新入度0的节点序列 if degree[i]==0: s.append(i) print(' '.join(map(str,res)) if len(res)==m else -1)