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 相关文章推荐
Python3实现从指定路径查找文件的方法
May 22 Python
Python爬虫爬取美剧网站的实现代码
Sep 03 Python
python 系统调用的实例详解
Jul 11 Python
Python内置模块turtle绘图详解
Dec 09 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 Python
python2.7到3.x迁移指南
Feb 01 Python
PyCharm配置mongo插件的方法
Nov 30 Python
详解pandas的外部数据导入与常用方法
May 01 Python
python求绝对值的三种方法小结
Dec 04 Python
tensorflow2.0保存和恢复模型3种方法
Feb 03 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 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基础知识:类与对象(1)
2006/12/13 PHP
php array_search() 函数使用
2010/04/13 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
python使用chardet判断字符串编码的方法
2015/03/13 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
python自动化脚本安装指定版本python环境详解
2017/09/14 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
StringBuilder和String的区别
2015/05/18 面试题
会计电算化个人自我评价
2013/11/17 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
文明城市创建标语
2014/06/16 职场文书
党员个人剖析材料
2014/09/30 职场文书
诚信教育主题班会
2015/08/13 职场文书
在CSS中使用when/else的方法
2022/01/18 HTML / CSS