NetworkX系列教程(10)-算法之二:最小/大生成树问题
重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图论
中常用算法弄个明白在写这部分.
图论常用算法看我的博客:
下面我将使用NetworkX实现上面的算法,建议不清楚的部分打开两篇博客对照理解.
我将图论的经典问题及常用算法的总结写在下面两篇博客中:
图论---问题篇
图论---算法篇
目录:
* 11.2最小/最大生成树问题
* 11.2.1最小生成树
* 11.2.2最大生成树
注意:如果代码出现找不库,请返回第一个教程,把库文件导入.
11.2最小/最大生成树问题
先构建graph,后面最小最大生成树在这个graph上求.
- #生成graph
- G.clear()
- G = nx.Graph()
- 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)])
- #边和节点信息
- edge_labels = nx.get_edge_attributes(G,'weight')
- labels={'0':'0','1':'1','2':'2','3':'3','4':'4'}
- #生成节点位置
- pos=nx.spring_layout(G)
- #把节点画出来
- nx.draw_networkx_nodes(G,pos,node_color='g',node_size=500,alpha=0.8)
- #把边画出来
- nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5,edge_color=['b','r','b','r','r','b','r'])
- #把节点的标签画出来
- nx.draw_networkx_labels(G,pos,labels,font_size=16)
- #把边权重画出来
- nx.draw_networkx_edge_labels(G, pos, edge_labels)
- #显示graph
- plt.title('有权图',fontproperties=myfont)
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- plt.show()

注:基本上,图示的红色线是最小生成树,蓝色是最大生成树,最小最大生成树都包含1-2这条边
11.2.1最小生成树
- #求得最小生成树,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal
- KA = nx.minimum_spanning_tree(G,algorithm='kruskal')
- print(KA.edges(data=True))
- #直接拿到构成最小生成树的边,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal
- mst = nx.minimum_spanning_edges(G, algorithm='kruskal', data=False)
- edgelist = list(mst)
- print(edgelist)
输出:
- [('3', '4', {'weight': 4}), ('3', '2', {'weight': 1}), ('0', '1', {'weight': 2}), ('2', '1', {'weight': 3})]
- [('3', '2'), ('0', '1'), ('1', '2'), ('4', '3')]
11.2.2最大生成树
- #返回无向图G上的最大生成树或森林。
- T = nx.maximum_spanning_tree(G)
- print(sorted(T.edges(data=True)))
- #直接拿到构成最大生成树,algorithm可以是kruskal,prim,boruvka一种,默认是kruskal
- mst = nx.tree.maximum_spanning_edges(G, algorithm='kruskal', data=False)
- edgelist = list(mst)
- print(edgelist)
输出:
- [('0', '2', {'weight': 7}), ('1', '4', {'weight': 5}), ('2', '1', {'weight': 3}), ('3', '1', {'weight': 8})]
NetworkX系列教程(10)-算法之二:最小/大生成树问题的更多相关文章
- NetworkX系列教程(10)-算法之五:广度优先与深度优先
小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...
- NetworkX系列教程(10)-算法之四:拓扑排序与最大流问题
小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...
- NetworkX系列教程(10)-算法之三:关键路径问题
小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...
- NetworkX系列教程(10)-算法之一:最短路径问题
小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...
- Linux Shell系列教程之(十二)Shell until循环
本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环和Lin ...
- 【D3.V3.js系列教程】--(十二)坐标尺度
[D3.V3.js系列教程]--(十二)坐标尺度 1.多种类型的缩放尺度 Quantitative Scales Linear Scales Identity Scales Power Scales ...
- Java NIO系列教程(三-十二) Buffer
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...
- [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)
之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
随机推荐
- QuartzNet 任务管理系统
最近有面试!都有问道Quartz方面的问题,之前的项目有使用过,也知道怎么用,但面试时要说出它的原理,一时半会还真说不来!查阅了一些资料先记录下来吧 Quartz.NET官网地址:https://ww ...
- 怎样理解window对象的几组位置大小属性
第一组: window.screenX 和 window.screenY, 只读, 返回浏览器窗口左上角与屏幕左上角的水平距离和垂直距离(单位像素); 第二组: window.innerHeight ...
- 音视频入门-10-使用libyuv对YUV数据进行缩放、旋转、镜像、裁剪、混合
* 音视频入门文章目录 * libyuv libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换.旋转.缩放等的库.它是跨平台的,可在 Windows.Linux.Mac.A ...
- React 脚手架支持Typescript和Sass
首先,创建React工程目录,以及选择Typescript版本 进入在my-app目录,安装node-sass 然后再安装webpack的sass-loader 接下来进入node_modules ...
- Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Convert an integer numb ...
- U盘因格式化 NTFS 中断造成无法识别,生产平台同样无法识别的修复处理方案
特征: 电脑设备管理器(win10):识别到大容量存储设备 电脑磁盘管理:识别可移动磁盘无媒体 ChipGenius(v4_19_0319):能识别到制造商,但识别不到芯片具体型号 U盘相关生产平台: ...
- springboot 日志配置
maven依赖中添加了 spring-boot-starter-logging : <dependency> <groupId>org.springframework.boot ...
- 2. 软件有很多种,也有各种分类办法: ShrinkWrap (在包装盒子里面的软件,软件在CD/DVD上); Web APP (基于网页的软件); Internal Software (企业或学校或某组织内部的软件); Games (游戏); Mobile Apps (手机应用); Operating Systems (操作系统); Tools
选取对你最相关的一类软件, 请回答:(web app) 1) 此类软件是什么时候开始出现的, 这些软件是怎么说服你(陌生人)成为他们的用户的? 他们的目标都是盈利么? 他们的目标都是赚取用户 ...
- jstack、jmc、jhat工具使用详解
jstack: 在上一次[https://www.cnblogs.com/webor2006/p/10669472.html]jcmd中也可以获取线程的堆栈信息,回顾一下: 其实在JDK中还有另一个专 ...
- jwt的原理以及使用
jwt原理(json web token) 我们之前是使用session实现登录,通过实际密码+盐组成字符串进行md5存入redis或者数据库中,输入的密码与实际校验通过,发送给客户端一个有效时间的t ...