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使用urllib2实现发送带cookie的请求
Apr 28 Python
Python中的一些陷阱与技巧小结
Jul 10 Python
python编程线性回归代码示例
Dec 07 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
Python实现随机漫步功能
Jul 09 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
Flask框架钩子函数功能与用法分析
Aug 02 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
PyTorch中Tensor的数据类型和运算的使用
Sep 03 Python
Python实现壁纸下载与轮换
Oct 19 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
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
实现PHP搜索加分页
2016/10/12 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
php取出数组单个值的方法
2018/03/12 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
python找出完数的方法
2018/11/12 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
关键字final的用法
2013/10/02 面试题
工程承包协议书
2014/04/22 职场文书
党校学习心得体会范文
2014/09/09 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
Go语言空白表示符_的实例用法
2021/07/04 Golang
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL