python | 算法-拓扑排序

写在前面:
我自己用python练习算法与数据结构的典型算法汇总在这里:汇总-算法与数据结构-python版,欢迎翻阅!

1️⃣ 参考链接https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class16/Code03_TopologySort.java

2️⃣ 所用例子
image

数据结构

与前章同:python | 算法-图的宽度优先遍历

拓扑排序算法

# 拓扑排序
# 适用于有向图+无环
class TopologicalOrder:
    def topoSort_bfs(self, graph):
        # 先建立以节点为键值,节点入度为值的映射表
        indegree_map = {}
        zero_degree_nodes = [] # 同时用队列记录下入度为0的节点
        for _, node in graph.nodes.items():
            indegree_map[node] = node.in_num
            if node.in_num == 0:
                zero_degree_nodes.append(node)

        #开始进行拓扑排序,结果保存在数组中
        results = [] # 保存输出的节点的值
        while len(zero_degree_nodes) > 0:
            cur = zero_degree_nodes.pop(0)
            results.append(cur.value)
            for next in cur.nexts:
                indegree_map[next] -= 1
                if indegree_map[next] == 0:
                    zero_degree_nodes.append(next)
        # 返回值就是目标数组
        return results

# test
matrix = [[0, 0, 1],
          [0, 0, 2],
          [0, 0, 3],
          [0, 1, 4],
          [0, 2, 4],
          [0, 2, 5],
          [0, 3, 4],
          [0, 3, 5]]
generator = GraphGenerator()
graph = generator.createGraph(matrix)

topo_sort = TopologicalOrder()
sort_result = topo_sort.topoSort_bfs(graph)
print(str(sort_result))
# 输出
# [0, 1, 2, 3, 4, 5]

我自己用python练习算法与数据结构的典型算法汇总在这里:汇总-算法与数据结构-python版,欢迎翻阅!

posted @ 2022-10-20 22:42  万国码aaa  阅读(203)  评论(0编辑  收藏  举报