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数组条件过滤filter函数使用示例
Jul 22 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
python给微信好友定时推送消息的示例
Feb 20 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
pandas数据处理之绘图的实现
Jun 15 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 Python
python如何查找列表中元素的位置
May 30 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
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
Python实现简单查找最长子串功能示例
2019/02/26 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
SQL面试题
2013/04/30 面试题
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
优秀大学生自荐信
2014/06/09 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
个人作风建设总结
2014/10/23 职场文书
培训督导岗位职责
2015/04/10 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
Python Django ORM连表正反操作技巧
2021/06/13 Python
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android