小书匠 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页面自定义分享

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. PB笔记之数据窗口可编辑的条件

    1.列的tab order为0,列不能获得焦点2.dw_control.object.datawindow.readonly="yes"3.DW.Object.<Column ...

  3. 前端require代码抽离小技巧

    DEMO 文件目录结构 plugin.js // /CommonJS规范 // var exports = module.exports; exports.test = function () { c ...

  4. Mac下Sublime Text3激活码

    方法1: 终端中打开文件 /etc/hosts,插入如下语句 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com 方法2: 在s ...

  5. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 表单送件按钮代码(一)cs(C#)(未完)

    protected void BtnRequest_Clich(object sender, EventArgs e) { lblMsg.Text= " " ; lblfmsg.T ...

  7. 我们为什么要通过python来入IT这一行

    我们为什么要通过python来入IT这一行 导语 ​ 这个问题,其实大部分在选择转行做IT,或者在行业内处于边缘化的非技术人员都会有这样的疑惑.毕竟,掌握一门技能,是需要花成本的.决策之前,做个前景判 ...

  8. UI5-技术篇-Navigation And Routing

    主要记录下Router设置过程中出现的几个问题 1.View 首页设置 controlId 2.Manifest设置 2.1设置启动页 2.2设置默认配置 2.3设置Targets 首页设置 子页设置 ...

  9. 用BIO手写实现Redis客户端的探究(拒绝Jedis)

    在Redis的使用过程中,大多数人都是使用现成的客户端,如Jedis,Redisson,Lettuce.因此本文研究用BIO的方式手写Redis客户端尝试,对遇到的问题进行探究及总结. Redis通讯 ...

  10. Thymeleaf 模板

    Thymeleaf 模板布局 th:fragment.th:replace.th:insert.th:remove th:fragment  模板布局 模板片段说明 模板中,经常希望从其他模板中包含⼀ ...