NetworkX之Prim算法(实例讲解)


Posted in Python onDecember 22, 2017

引言

Prim算法与Dijkstra的最短路径算法类似,它采用贪心策略。算法开始先把图中权值最小的边添加到树T中,然后不断把权值最小的边E(E的一个端点在T中,另一个在G-T中)。当没有符合条件的E时算法结束,此时T就是G的一个最小生成树。

NetworkX是一款Python的软件包,用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。 本文借助networkx.Graph类实现Prim算法。

正文

Prim算法的代码

Prim

NetworkX之Prim算法(实例讲解)

def prim(G, s):
 dist = {} # dist记录到节点的最小距离
 parent = {} # parent记录最小生成树的双亲表
 Q = list(G.nodes()) # Q包含所有未被生成树覆盖的节点
 MAXDIST = 9999.99 # MAXDIST表示正无穷,即两节点不邻接
 # 初始化数据
 # 所有节点的最小距离设为MAXDIST,父节点设为None
 for v in G.nodes():
  dist[v] = MAXDIST
  parent[v] = None
 # 到开始节点s的距离设为0
 dist[s] = 0
 # 不断从Q中取出“最近”的节点加入最小生成树
 # 当Q为空时停止循环,算法结束
 while Q:
  # 取出“最近”的节点u,把u加入最小生成树
  u = Q[0]
  for v in Q:
   if (dist[v] < dist[u]):
    u = v
  Q.remove(u)
  # 更新u的邻接节点的最小距离
  for v in G.adj[u]:
   if (v in Q) and (G[u][v]['weight'] < dist[v]):
    parent[v] = u
    dist[v] = G[u][v]['weight']
 # 算法结束,以双亲表的形式返回最小生成树
 return parent

测试数据

从~到 2 3 4 5 6 7 8
1 1.3 2.1 0.9 0.7 1.8 2.0 1.8
2 0.9 1.8 1.2 2.8 2.3 1.1
3 2.6 1.7 2.5 1.9 1.0
4 0.7 1.6 1.5 0.9
5 0.9 1.1 0.8
6 0.6 1.0
7 0.5

NetworkX之Prim算法(实例讲解)

测试代码

import matplotlib.pyplot as plt
import networkx as nx
g_data = [(1, 2, 1.3), (1, 3, 2.1), (1, 4, 0.9), (1, 5, 0.7), (1, 6, 1.8), (1, 7, 2.0), (1, 8, 1.8), (2, 3, 0.9), (2, 4, 1.8), (2, 5, 1.2), (2, 6, 2.8), (2, 7, 2.3), (2, 8, 1.1), (3, 4, 2.6), (3, 5, 1.7), (3, 6, 2.5), (3, 7, 1.9), (3, 8, 1.0), (4, 5, 0.7), (4, 6, 1.6), (4, 7, 1.5), (4, 8, 0.9), (5, 6, 0.9), (5, 7, 1.1), (5, 8, 0.8), (6, 7, 0.6), (6, 8, 1.0), (7, 8, 0.5)]
def draw(g):
 pos = nx.spring_layout(g)
 nx.draw(g, pos, \
   arrows=True, \
   with_labels=True, \
   nodelist=g.nodes(), \
   style='dashed', \
   edge_color='b', \
   width=2, \
   node_color='y', \
   alpha=0.5)
 plt.show()
g = nx.Graph()
g.add_weighted_edges_from(g_data)
tree = prim(g, 1)
mtg = nx.Graph()
mtg.add_edges_from(tree.items())
mtg.remove_node(None)
draw(mtg)

运行结果

NetworkX之Prim算法(实例讲解)

以上这篇NetworkX之Prim算法(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python本地与全局命名空间用法实例
Jun 16 Python
Python  Django 母版和继承解析
Aug 09 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
Keras之fit_generator与train_on_batch用法
Jun 17 Python
Python如何给函数库增加日志功能
Aug 04 Python
Python pymsql模块的使用
Sep 07 Python
python两个list[]相加的实现方法
Sep 23 Python
python中的None与NULL用法说明
May 25 Python
Python实现控制台中的进度条功能代码
Dec 22 #Python
Python中的探索性数据分析(功能式)
Dec 22 #Python
Python反射用法实例简析
Dec 22 #Python
Python文本特征抽取与向量化算法学习
Dec 22 #Python
用Python实现KNN分类算法
Dec 22 #Python
Python数据拟合与广义线性回归算法学习
Dec 22 #Python
python 动态加载的实现方法
Dec 22 #Python
You might like
改造一台复古桌面收音机
2021/03/02 无线电
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
php验证session无效的解决方法
2014/11/04 PHP
PHP生成plist数据的方法
2015/06/16 PHP
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
私有程序集与共享程序集有什么区别
2013/04/05 面试题
印刷技术专业自荐信
2014/09/18 职场文书
个人查摆剖析材料
2014/10/04 职场文书
四年级语文教学反思
2016/03/03 职场文书