Echo32398 2023-09-06 18:42 采纳率: 80%
浏览 3
已结题

如何将节点关系node_relations改为用户输入模式,有用户输入节点关系,使其达到用户可以通过该界面输入关系,显示关系图,并运行后给出尽可能多的拓扑排序结果的效果



from collections import defaultdict
from graphviz import Digraph


def create_graph(node_relations):
    graph = defaultdict(list)
    for u, v in node_relations:
        graph[u].append(v)
    return graph


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

    def topological_sort_util(v):
        visited[v] = True
        for node in graph[v]:
            if not visited[node]:
                topological_sort_util(node)
        stack.insert(0, v)

    for node in visited.keys():
        if not visited[node]:
            topological_sort_util(node)

    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
        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 = (('MA140', 'MA141'),('MA141', 'MA140'),('MA141', 'CS225'),
                      ('MA141', 'CS150'),('CS150', 'MA141'),('CS150', 'CS155'),
                      ('CS225', 'MA141'),('CS225', 'CS155'),('CS225', 'CS300'),
                      ('CS225', 'CS250'),('CS225', 'CS230'),('CS155', 'CS225'),
                      ('CS155', 'CS200'),('CS155', 'CS150'),('CS200', 'CS155'),
                      ('CS250', 'CS350'),('CS250', 'CS360'),('CS250', 'CS225'),
                      ('CS350', 'CS250'),('CS230', 'CS225'),('CS300', 'CS340'),
                      ('CS300', 'CS301'),('CS300', 'CS225'),('CS301', 'CS300'),
                      ('CS340', 'CS360'),('CS340', 'CS300'),('CS340', 'CS345'),
                      ('CS345', 'CS340'),('CS360', 'CS390'),('CS360', 'CS250'),
                      ('CS360', 'CS340'),('CS390', 'CS360'))
    # 创建图
    graph = create_graph(node_relations)
    # 拓扑排序
    topo_list = topological_sort(graph)
    print(topo_list)
    # 绘图
    draw_graph(node_relations)

img


如何将节点关系node_relations改为用户输入模式,有用户输入节点关系,使其达到用户可以通过该界面输入关系,显示关系图,并运行后给出尽可能多的拓扑排序结果的效果,谢谢

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-06 20:41
    关注

    【以下回答由 GPT 生成】

    from collections import defaultdict
    from graphviz import Digraph
    
    def create_graph(node_relations):
        graph = defaultdict(list)
        for u, v in node_relations:
            graph[u].append(v)
        return graph
    
    def topological_sort(graph):
        visited = {}
        for key, values in graph.items():
            visited[key] = False
            for val in values:
                visited[val] = False
        stack = []
    
        def topological_sort_util(v):
            visited[v] = True
            for node in graph[v]:
                if not visited[node]:
                    topological_sort_util(node)
            stack.insert(0, v)
    
        for node in visited.keys():
            if not visited[node]:
                topological_sort_util(node)
    
        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
            dot.edge(relation[0], relation[1], len='3')
        dot.render(directory='doctest-output', view=True).replace('\\', '/')
    
    if __name__ == '__main__':
        # 通过用户界面输入节点关系
        node_relations_input = input("请输入节点关系,以逗号分隔:")
        node_relations = [tuple(relation.split(',')) for relation in node_relations_input.split()]
    
        # 创建关系图
        graph = create_graph(node_relations)
    
        # 进行拓扑排序
        sorted_nodes = topological_sort(graph)
    
        # 输出拓扑排序结果
        print("拓扑排序结果:")
        for node in sorted_nodes:
            print(node)
    
        # 绘制关系图并显示在界面上
        draw_graph(node_relations)
    

    通过上述代码的修改,用户可以通过界面输入节点关系,并且能够显示关系图并进行拓扑排序。代码使用了input函数获取用户输入的节点关系,并通过逗号分隔后转换为节点关系列表。然后调用了create_graph函数创建关系图,并使用topological_sort函数进行拓扑排序。最后,通过draw_graph函数绘制关系图并显示在界面上。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月15日
  • 已采纳回答 9月7日
  • 创建了问题 9月6日

悬赏问题

  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?