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实现删除列表中满足一定条件的元素示例
Jun 12 Python
Python使用smtp和pop简单收发邮件完整实例
Jan 09 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
django重新生成数据库中的某张表方法
Aug 28 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
python字符串下标与切片及使用方法
Feb 13 Python
python_mask_array的用法
Feb 18 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
keras输出预测值和真实值方式
Jun 27 Python
Python用access判断文件是否被占用的实例方法
Dec 17 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
javascript 鼠标滚轮事件
2009/04/09 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
简单介绍python封装的基本知识
2019/08/10 Python
python实现代码统计程序
2019/09/19 Python
python查看数据类型的方法
2019/10/12 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
自学考试自我鉴定范文
2013/09/26 职场文书
银行门卫岗位职责
2013/12/29 职场文书
股份合作协议书
2014/09/10 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技