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使用BeautifulSoup分析网页信息的方法
Apr 04 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
带你认识Django
Jan 15 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
在python中用url_for构造URL的方法
Jul 25 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
python实现在一个画布上画多个子图
Jan 19 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 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
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
php实现学生管理系统
2020/03/21 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
基本DOM节点操作
2017/01/17 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
[52:40]完美世界DOTA2联赛PWL S2 Magma vs GXR 第一场 11.29
2020/12/02 DOTA
Python实现点云投影到平面显示
2020/01/18 Python
佳能英国官方网站:Canon UK
2017/08/08 全球购物
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
管理科学大学生求职信
2013/11/13 职场文书
特色冷饮店创业计划书
2014/01/28 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
销售个人求职信范文
2014/04/28 职场文书
说明书格式及范文
2014/05/07 职场文书
法制演讲稿
2014/09/10 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
培训师岗位职责
2015/02/14 职场文书
冰雪公主观后感
2015/06/16 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技