算法-图论-拓扑排序
1. 拓扑排序(卡码网 117)
思路:
- 维护每个顶点的入度
inDegrees
- 入度为0的顶点可选,加入可选
队列
。 - 一个顶点被选后,其指向的顶点的入度需要减一。(相当于该顶点从图中被删除)
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()