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实现的下载8000首儿歌的代码分享
Nov 21 Python
举例讲解Python中的身份运算符的使用方法
Oct 13 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
分享6个隐藏的python功能
Dec 07 Python
python微信跳一跳游戏辅助代码解析
Jan 29 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python实现证件照换底功能
Aug 20 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
PyQt5 界面显示无响应的实现
Mar 26 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 远程图片保存到本地的函数类
2008/12/08 PHP
PHP教程 变量定义
2009/10/23 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
python 切片和range()用法说明
2013/03/24 Python
Python中splitlines()方法的使用简介
2015/05/20 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
农行实习自我鉴定
2013/09/22 职场文书
满月酒答谢词
2014/01/14 职场文书
社区食品安全实施方案
2014/03/28 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
公司租车协议书
2015/01/29 职场文书
小学运动会开幕词
2016/03/04 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis