算法-图论-拓扑排序
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()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了