算法-图论-拓扑排序

1. 拓扑排序(卡码网 117)

思路

  1. 维护每个顶点的入度inDegrees
  2. 入度为0的顶点可选,加入可选队列
  3. 一个顶点被选后,其指向的顶点的入度需要减一。(相当于该顶点从图中被删除)
from collections import deque, defaultdict

def main():
    num_node, num_edge = map(int, input().split())
    inDegrees = [0 for _ in range(num_node)]
    edges = defaultdict(list)
    for _ in range(num_edge):
        source, target = map(int, input().split())
        inDegrees[target] += 1
        edges[source].append(target)
    
    # 入度为0的顶点加入队列
    que = deque([i for i in range(num_node) if inDegrees[i] == 0])
    result = []
    
    while que:
        cur = que.popleft()
        result.append(cur)
        for t in edges[cur]:
            # cur -> t,顶点t入度减一
            inDegrees[t] -= 1
            # 入度为0,则加入可选队列
            if inDegrees[t] == 0:
                que.append(t)
    
    if len(result) == num_node:
        print(" ".join(map(str, result)))
    else:
        print(-1)
    
    
if __name__ == "__main__":
    main()
posted @ 2024-11-03 12:02  Frank23  阅读(4)  评论(0编辑  收藏  举报