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获取从命令行输入数字的方法
Apr 29 Python
详解Python中的动态属性和特性
Apr 07 Python
Python实现中一次读取多个值的方法
Apr 22 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
Python的UTC时间转换讲解
Feb 26 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
python 装饰器的基本使用
Jan 13 Python
tensorflow中的数据类型dtype用法说明
May 26 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的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
浅谈js闭包理解
2019/04/01 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
Django实现组合搜索的方法示例
2018/01/23 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
2018/02/26 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
医学专业职业生涯规划范文
2014/02/05 职场文书
公务员转正鉴定材料
2014/02/11 职场文书
三好生演讲稿
2014/09/12 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android