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

【模板】拓扑排序

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)

全部评论

相关推荐

头像
05-16 11:16
已编辑
东华理工大学 Java
牛客737698141号:盲猜几十人小公司,庙小妖风大,咋不叫她去4️⃣呢😁
点赞 评论 收藏
分享
雪飒:我也遇见过,我反问他有考虑来华为od吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务