"""
设计:Python程序设计
作者:初学者
日期:2022年 04月 30日
"""
# 例114 拓扑排序
# 1.问题描述
# 给定一个有向图,图节点的拓扑排序定义如下;(1)对于图中的每一条有向边A——》B,
# 在拓扑排序中A一定在B之前;(2)拓扑排序中的第一的节点可以是图中的任何一个没有其他节点指向它的节点。
# 针对给定的有向图找到任意一种拓扑排序的顺序。
# 2.问题示例
# 有向图的拓扑排序可以为:
# [0,1,2,3,4,5]
# [0,2,3,1,5,4]
# 3.代码实现
# 定义有向图节点
class DirectedMapNode:
def __init__(self, x):
self.label = x
self.neighbors = []
class Solution:
"""
参数graph:有向图节点列表
返回值:整数列表
"""
def top_sort(self, graph):
indegree = {}
for x in graph:
indegree[x] = 0
for i in graph:
for j in i.neighbors:
indegree[j] += 1
ans = []
for i in graph:
if indegree[i] == 0:
self.dfs(i, indegree, ans)
return ans
def dfs(self, i, indegree, ans):
ans.append(i.label)
indegree[i] -= 1
for j in i.neighbors:
indegree[j] -= 1
if indegree[j] == 0:
self.dfs(j, indegree, ans)
# 主函数
if __name__ == '__main__':
s = Solution()
g0 = DirectedMapNode(0)
g1 = DirectedMapNode(1)
g2 = DirectedMapNode(2)
g3 = DirectedMapNode(3)
g4 = DirectedMapNode(4)
g5 = DirectedMapNode(5)
g0.neighbors = [g1, g2, g3]
g1.neighbors = [g4]
g2.neighbors = [g4, g5]
g3.neighbors = [g4, g5]
graph = [g0, g1, g2, g3, g4, g5]
result = s.top_sort(graph)
print("输入:")
print("输出:", result)
拓扑排序示例
最新推荐文章于 2023-05-03 20:00:13 发布