题解 | #【模板】拓扑排序#

【模板】拓扑排序

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)

全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务