zoukankan      html  css  js  c++  java
  • NetworkX系列教程(10)-算法之二:最小/大生成树问题

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

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

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

    目录:
    * 11.2最小/最大生成树问题
    * 11.2.1最小生成树
    * 11.2.2最大生成树


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

    11.2最小/最大生成树问题

    先构建graph,后面最小最大生成树在这个graph上求.

    1. #生成graph 
    2. G.clear() 
    3. G = nx.Graph() 
    4. G.add_weighted_edges_from([('0','1',2),('0','2',7),('1','2',3),('1','3',8),('1','4',5),('2','3',1),('3','4',4)]) 
    5.  
    6. #边和节点信息 
    7. edge_labels = nx.get_edge_attributes(G,'weight')  
    8. labels={'0':'0','1':'1','2':'2','3':'3','4':'4'
    9.  
    10. #生成节点位置  
    11. pos=nx.spring_layout(G)  
    12.  
    13. #把节点画出来  
    14. nx.draw_networkx_nodes(G,pos,node_color='g',node_size=500,alpha=0.8)  
    15.  
    16. #把边画出来  
    17. nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5,edge_color=['b','r','b','r','r','b','r'])  
    18.  
    19. #把节点的标签画出来  
    20. nx.draw_networkx_labels(G,pos,labels,font_size=16)  
    21.  
    22. #把边权重画出来  
    23. nx.draw_networkx_edge_labels(G, pos, edge_labels)  
    24.  
    25. #显示graph 
    26. plt.title('有权图',fontproperties=myfont) 
    27. plt.axis('on'
    28. plt.xticks([]) 
    29. plt.yticks([]) 
    30. plt.show() 

    最小/最大生成树示例
    最小/最大生成树示例

    注:基本上,图示的红色线是最小生成树,蓝色是最大生成树,最小最大生成树都包含1-2这条边


    11.2.1最小生成树

    1. #求得最小生成树,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal 
    2. KA = nx.minimum_spanning_tree(G,algorithm='kruskal'
    3. print(KA.edges(data=True)) 
    4.  
    5. #直接拿到构成最小生成树的边,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal 
    6. mst = nx.minimum_spanning_edges(G, algorithm='kruskal', data=False
    7. edgelist = list(mst) 
    8. print(edgelist) 

    输出:

    1. [('3', '4', {'weight': 4}), ('3', '2', {'weight': 1}), ('0', '1', {'weight': 2}), ('2', '1', {'weight': 3})] 
    2. [('3', '2'), ('0', '1'), ('1', '2'), ('4', '3')] 

    11.2.2最大生成树

    1. #返回无向图G上的最大生成树或森林。 
    2. T = nx.maximum_spanning_tree(G) 
    3. print(sorted(T.edges(data=True))) 
    4.  
    5. #直接拿到构成最大生成树,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal 
    6. mst = nx.tree.maximum_spanning_edges(G, algorithm='kruskal', data=False
    7. edgelist = list(mst) 
    8. print(edgelist) 

    输出:

    1. [('0', '2', {'weight': 7}), ('1', '4', {'weight': 5}), ('2', '1', {'weight': 3}), ('3', '1', {'weight': 8})] 
  • 相关阅读:
    cron表达式
    mybatis中的#{}和${}
    mysql免安装版使用
    关于jpa添加一对多数据时外键值为空的问题
    关于时间格式化和格式转换
    属性和属性节点
    ErrorException: ORA-00904: : 标识符无效
    345. 反转字符串中的元音字母
    java 解决nginx代理的跨域访问问题
    633. 平方数之和
  • 原文地址:https://www.cnblogs.com/wushaogui/p/9239959.html
Copyright © 2011-2022 走看看