Python实现拓扑排序并绘图

 绘图需要:

1. 需要安装graphviz软件,配置bin文件夹到环境变量
windows:
下载地址:https://graphviz.gitlab.io
Linux:
# yum下载graphviz软件:
yum -y install graphviz
2. 需要安装python的graphviz模块
pip install graphviz
from collections import defaultdict

from graphviz import Digraph


class Graph:
    def __init__(self, vertices):
        self.graph = defaultdict(list)
        self.V = vertices

    def addEdge(self, u, v):
        self.graph[u].append(v)

    def topologicalSortUtil(self, v, visited, stack):

        visited[v] = True

        for node in self.graph[v]:
            if visited[node] == False:
                self.topologicalSortUtil(node, visited, stack)

        stack.insert(0, v)

    def topologicalSort(self):
        visited = {}
        for key, values in self.graph.items():
            visited[key] = False
            for val in values:
                visited[val] = False
        stack = []

        for node in visited.keys():
            if visited[node] == False:
                self.topologicalSortUtil(node, visited, stack)

        return stack

def draw_graph(node_relations):
    dot = Digraph(comment='node graph', filename='blueprintNodeGraph-neato', format='png', engine='neato')
    dot.attr(
        'node',
        shape='box', style='rounded,filled',
        fixedsize='false',
        fontname='Microsoft YaHei', fontsize='12')
    node_size = 0
    for relation in node_relations:
        node_size += 1
        # wrapsize = 12
        # dot.node(textwrap.fill(node_name, wrapsize))
        dot.edge(relation[0], relation[1], len='3')
        print(f"{relation[0]} -> {relation[1]}")
    dot.render(directory='doctest-output', view=True).replace('\\', '/')


if __name__ == '__main__':
    node_relations = (('A', 'B'),
                      ('A', 'C'),
                      ('B', 'C'),
                      ('C', 'D'),
                      ('C', 'E'),
                      ('E', 'F'),
                      ('E', 'G'),
                      ('E', 'H'))
    # 拓扑排序
    g = Graph(8)
    for a, b in node_relations:
        g.addEdge(a, b)
    topo_list = g.topologicalSort()
    print(topo_list)
    # 绘图
    draw_graph(node_relations)

执行后输出:

# output
['A', 'B', 'C', 'E', 'H', 'G', 'F', 'D']
A -> B
A -> C
B -> C
C -> D
C -> E
E -> F
E -> G
E -> H

 拓扑图:

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值