小书匠 Graph 图论 

重头戏部分来了,写到这里我感觉得仔细认真点了,可能在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. edge_labels = nx.get_edge_attributes(G,'weight')  

  7. labels={'0':'0','1':'1','2':'2','3':'3','4':'4'} 


  8. #生成节点位置  

  9. pos=nx.spring_layout(G)  


  10. #把节点画出来  

  11. nx.draw_networkx_nodes(G,pos,node_color='g',node_size=500,alpha=0.8)  


  12. #把边画出来  

  13. nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5,edge_color=['b','r','b','r','r','b','r'])  


  14. #把节点的标签画出来  

  15. nx.draw_networkx_labels(G,pos,labels,font_size=16)  


  16. #把边权重画出来  

  17. nx.draw_networkx_edge_labels(G, pos, edge_labels)  


  18. #显示graph 

  19. plt.title('有权图',fontproperties=myfont) 

  20. plt.axis('on') 

  21. plt.xticks([]) 

  22. plt.yticks([]) 

  23. 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. #直接拿到构成最小生成树的边,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal 

  5. mst = nx.minimum_spanning_edges(G, algorithm='kruskal', data=False) 

  6. edgelist = list(mst) 

  7. 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. #直接拿到构成最大生成树,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal 

  5. mst = nx.tree.maximum_spanning_edges(G, algorithm='kruskal', data=False) 

  6. edgelist = list(mst) 

  7. print(edgelist) 

输出:

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

NetworkX系列教程(10)-算法之二:最小/大生成树问题的更多相关文章

  1. NetworkX系列教程(10)-算法之五:广度优先与深度优先

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

  2. NetworkX系列教程(10)-算法之四:拓扑排序与最大流问题

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

  3. NetworkX系列教程(10)-算法之三:关键路径问题

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

  4. NetworkX系列教程(10)-算法之一:最短路径问题

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

  5. Linux Shell系列教程之(十二)Shell until循环

    本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环和Lin ...

  6. 【D3.V3.js系列教程】--(十二)坐标尺度

    [D3.V3.js系列教程]--(十二)坐标尺度 1.多种类型的缩放尺度 Quantitative Scales Linear Scales Identity Scales Power Scales ...

  7. Java NIO系列教程(三-十二) Buffer

    原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...

  8. [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)

    之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...

  9. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

随机推荐

  1. H5中表格的用法

    1.表格的基本结构: 表格由行和列组成,单元格式表格的最基本单元;每个表格均有若干行,行标签由<tr></tr>定义,每行被分割为若干单元格,由<td></t ...

  2. PowerBuilder学习笔记之调用事件和函数

    2.7.1调用事件和函数 完整语法:[ObjectName]ancestorclass::[type][when]name([argumnetlist]) 说明:ObjectName:指定函数或事件的 ...

  3. gulp删除目标文件中所有的console.log()语句——gulp-strip-debug

    1.安装npm包 npm install --save-dev gulp-strip-debug 2.使用 const gulp = require('gulp'); const stripDebug ...

  4. Docker可视化管理工具portainer的简单应用

    portainer简介 略 安装portainer $ docker pull portainer/portainer$ docker volume create portainer_data $ d ...

  5. POJ3368(Frequent values)--线段树

    题目在这里 3368 Accepted 7312K 1829MS C++ 6936B 题意为给你一组数据,再给定一组区间,问你这个区间内出现次数最多的元素的次数是多少. 我还记得这题是学校校赛基础的题 ...

  6. jQuery遍历(2)

    上期我们讲了遍历的祖先和后代的问题,现在我们讲讲遍历同胞 同胞拥有相同的父元素. 通过 jQuery,您能够在 DOM 树中遍历元素的同胞元素. jQuery siblings() 方法 siblin ...

  7. pc端vue 滚动到底部翻页

    html: <div class="list" ref="scrollTopList"> <div class="listsmall ...

  8. English-培训5-How much is it

  9. java引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  10. sed进阶教程

    寻址规则 常规寻址 如果没有指定地址,那么命令将应用于每一行. 如果只有一个地址,那么命令应用于与这个地址匹配的任意行. 如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址(不包括第一个地址 ...