python最小生成树kruskal与prim算法详解


Posted in Python onJanuary 17, 2019

kruskal算法基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直到遍历完所有的边。

prim算法基本思路:所有节点分成两个group,一个为已经选取的selected_node(为list类型),一个为candidate_node,首先任取一个节点加入到selected_node,然后遍历头节点在selected_node,尾节点在candidate_node的边,选取符合这个条件的边里面权重最小的边,加入到最小生成树,选出的边的尾节点加入到selected_node,并从candidate_node删除。直到candidate_node中没有备选节点(这个循环条件要求所有节点都有边连接,即边数要大于等于节点数-1,循环开始前要加入这个条件判断,否则可能会有节点一直在candidate中,导致死循环)。

#coding=utf-8
class Graph(object):
  def __init__(self, maps):
    self.maps = maps
    self.nodenum = self.get_nodenum()
    self.edgenum = self.get_edgenum()
 
  def get_nodenum(self):
    return len(self.maps)
 
  def get_edgenum(self):
    count = 0
    for i in range(self.nodenum):
      for j in range(i):
        if self.maps[i][j] > 0 and self.maps[i][j] < 9999:
          count += 1
    return count
 
  def kruskal(self):
    res = []
    if self.nodenum <= 0 or self.edgenum < self.nodenum-1:
      return res
    edge_list = []
    for i in range(self.nodenum):
      for j in range(i,self.nodenum):
        if self.maps[i][j] < 9999:
          edge_list.append([i, j, self.maps[i][j]])#按[begin, end, weight]形式加入
    edge_list.sort(key=lambda a:a[2])#已经排好序的边集合
    
    group = [[i] for i in range(self.nodenum)]
    for edge in edge_list:
      for i in range(len(group)):
        if edge[0] in group[i]:
          m = i
        if edge[1] in group[i]:
          n = i
      if m != n:
        res.append(edge)
        group[m] = group[m] + group[n]
        group[n] = []
    return res
 
  def prim(self):
    res = []
    if self.nodenum <= 0 or self.edgenum < self.nodenum-1:
      return res
    res = []
    seleted_node = [0]
    candidate_node = [i for i in range(1, self.nodenum)]
    
    while len(candidate_node) > 0:
      begin, end, minweight = 0, 0, 9999
      for i in seleted_node:
        for j in candidate_node:
          if self.maps[i][j] < minweight:
            minweight = self.maps[i][j]
            begin = i
            end = j
      res.append([begin, end, minweight])
      seleted_node.append(end)
      candidate_node.remove(end)
    return res
 
max_value = 9999
row0 = [0,7,max_value,max_value,max_value,5]
row1 = [7,0,9,max_value,3,max_value]
row2 = [max_value,9,0,6,max_value,max_value]
row3 = [max_value,max_value,6,0,8,10]
row4 = [max_value,3,max_value,8,0,4]
row5 = [5,max_value,max_value,10,4,0]
maps = [row0, row1, row2,row3, row4, row5]
graph = Graph(maps)
print('邻接矩阵为\n%s'%graph.maps)
print('节点数据为%d,边数为%d\n'%(graph.nodenum, graph.edgenum))
print('------最小生成树kruskal算法------')
print(graph.kruskal())
print('------最小生成树prim算法')
print(graph.prim())

初始的图如下。

python最小生成树kruskal与prim算法详解

运行结果如下。

python最小生成树kruskal与prim算法详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
MySQLdb ImportError: libmysqlclient.so.18解决方法
Aug 21 Python
python生成n个元素的全组合方法
Nov 13 Python
对python3标准库httpclient的使用详解
Dec 18 Python
python安装requests库的实例代码
Jun 25 Python
python openpyxl使用方法详解
Jul 18 Python
python脚本后台执行方式
Dec 21 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
如何用Python提取10000份log中的产品信息
Jan 14 Python
详解Python中的Lock和Rlock
Jan 26 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 #Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 #Python
Python设计模式之模板方法模式实例详解
Jan 17 #Python
Python设计模式之外观模式实例详解
Jan 17 #Python
Python pycharm 同时加载多个项目的方法
Jan 17 #Python
Python设计模式之建造者模式实例详解
Jan 17 #Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 #Python
You might like
php include加载文件两种方式效率比较
2010/08/08 PHP
PHP时间格式控制符对照表分享
2013/07/23 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
php实现数组重复数字统计实例
2018/09/30 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
理解Python中函数的参数
2015/04/27 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
Python之变量类型和if判断方式
2020/05/05 Python
python使用建议与技巧分享(二)
2020/08/17 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
音乐表演专业毕业生求职信
2013/10/14 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
对照检查剖析材料
2014/09/30 职场文书
2015年为民办实事工作总结
2015/05/26 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android