zoukankan      html  css  js  c++  java
  • NetworkX系列教程(10)-算法之四:拓扑排序与最大流问题

    重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图论中常用算法弄个明白在写这部分.

    图论常用算法看我的博客:

    下面我将使用NetworkX实现上面的算法,建议不清楚的部分打开两篇博客对照理解.
    我将图论的经典问题及常用算法的总结写在下面两篇博客中:
    图论---问题篇
    图论---算法篇

    目录:
    * 11.4拓扑排序算法(TSA)
    * 11.5最大流问题


    注意:如果代码出现找不库,请返回第一个教程,把库文件导入.

    11.4拓扑排序算法(TSA)

    1. DG = nx.DiGraph([('a', 'b'), ('a', 'c'),('b', 'e'), ('b', 'd'),('c', 'e'), ('c', 'd'),('d', 'f'), ('f', 'g'), ('e', 'g')]) 
    2.  
    3. #显示graph 
    4. nx.draw_spring(DG,with_labels=True) 
    5. plt.title('有向无环图',fontproperties=myfont) 
    6. plt.axis('on') 
    7. plt.xticks([]) 
    8. plt.yticks([]) 
    9. plt.show() 
    10.  
    11. #这个graph拓扑排序序列有很多,这里只给出一种 
    12. print('扑排序序列:',list(nx.topological_sort(DG))) 
    13. print('逆扑排序序列:',list(reversed(list(nx.topological_sort(DG))))) 

    拓扑排序算法示例
    拓扑排序算法示例

    输出:

    拓扑序序列: ['a', 'b', 'c', 'e', 'd', 'f', 'g']
    逆拓扑序序列: ['g', 'f', 'd','e', 'c', 'b', 'a']


    11.5最大流问题

    1. #构建graph 
    2. G = nx.DiGraph() 
    3. G.add_edge('x','a', capacity=3.0) 
    4. G.add_edge('x','b', capacity=1.0) 
    5. G.add_edge('a','c', capacity=3.0) 
    6. G.add_edge('b','c', capacity=5.0) 
    7. G.add_edge('b','d', capacity=4.0) 
    8. G.add_edge('d','e', capacity=2.0) 
    9. G.add_edge('c','y', capacity=2.0) 
    10. G.add_edge('e','y', capacity=3.0) 
    11. pos=nx.spring_layout(G) 
    12.  
    13. #显示graph 
    14. edge_labels = nx.get_edge_attributes(G,'capacity') 
    15. nx.draw_networkx_nodes(G,pos) 
    16. nx.draw_networkx_labels(G,pos) 
    17. nx.draw_networkx_edges(G,pos) 
    18. nx.draw_networkx_edge_labels(G, pos,edge_labels) 
    19. plt.axis('on') 
    20. plt.xticks([]) 
    21. plt.yticks([]) 
    22. plt.show() 
    23.  
    24. #求最大流 
    25. flow_value, flow_dict = nx.maximum_flow(G, 'x', 'y') 
    26. print("最大流值: ",flow_value) 
    27. print("最大流流经途径: ",flow_dict) 

    最大流问题示例
    最大流问题示例

    输出:

    最大流值: 3.0
    最大流流经途径: {'x': {'a': 2.0, 'b': 1.0}, 'c': {'y': 2.0}, 'b': {'c': 0, 'd': 1.0}, 'y': {}, 'd': {'e': 1.0}, 'e': {'y': 1.0}, 'a':{'c': 2.0}}

  • 相关阅读:
    IoC 中 car 对象的配置如下,现在要添加 user 对象,并且将 car 注入到 user 中,正确的配置是?
    说说 IoC 中的继承和 Java 继承的区别
    bean 的 scope 有几种类型?请详细列举。
    简单谈谈 IoC 容器的原理
    谈谈你对 Spring IoC 和 DI 的理解,它们有什么区别?
    day13-14 内置函数
    day12 生成器(重要)
    day11 闭包和迭代器
    day10 函数进阶
    day09 函数
  • 原文地址:https://www.cnblogs.com/wushaogui/p/9240753.html
Copyright © 2011-2022 走看看