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编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python编程之Re模块下的函数介绍
Oct 28 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
python3 下载网络图片代码实例
Aug 27 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
keras 如何保存最佳的训练模型
May 25 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
python对文档中元素删除,替换操作
Apr 02 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php 启动报错如何解决
2014/01/17 PHP
PHP二维数组去重算法
2016/12/17 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
基于python中的TCP及UDP(详解)
2017/11/06 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
python pygame实现五子棋小游戏
2020/10/26 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
Python实现图片添加文字
2019/11/26 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
大学生实习期自我评价范文
2013/10/03 职场文书
工程招投标邀请书
2014/01/26 职场文书
小区门卫管理制度
2014/01/29 职场文书
新员工辞职信范文
2015/05/12 职场文书
花木兰观后感
2015/06/10 职场文书
Python基础之条件语句详解
2021/06/16 Python
试了下Golang实现try catch的方法
2021/07/01 Golang
2022漫威和DC电影上映作品
2022/04/05 欧美动漫
如何使用python包中的sched事件调度器
2022/04/30 Python