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 相关文章推荐
Python多进程multiprocessing用法实例分析
Aug 18 Python
彻底理解Python list切片原理
Oct 27 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
分享vim python缩进等一些配置
Jul 02 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
Python post请求实现代码实例
Feb 28 Python
Pytorch转onnx、torchscript方式
May 25 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
十个Python自动化常用操作,即拿即用
May 10 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实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
Python实现把xml或xsl转换为html格式
2015/04/08 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Django 解决由save方法引发的错误
2020/05/21 Python
python 实现单例模式的5种方法
2020/09/23 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
联想台湾官网:Lenovo TW
2018/05/09 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
机械制造专业个人的自我评价
2013/12/28 职场文书
房屋转让协议书
2014/04/11 职场文书
2014年民政工作总结
2014/11/26 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python