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中的对象拷贝示例 python引用传递
Jan 23 Python
Python中Collection的使用小技巧
Aug 18 Python
Python MySQLdb Linux下安装笔记
May 09 Python
基于Python实现文件大小输出
Jan 11 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
详解python之heapq模块及排序操作
Apr 04 Python
Django如何防止定时任务并发浅析
May 14 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
原生python实现knn分类算法
Oct 24 Python
Python使用Excel将数据写入多个sheet
May 16 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 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
德生1994机评
2021/03/02 无线电
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
Js动态创建div
2008/09/25 Javascript
Javascript的闭包
2009/12/31 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
JQuery动画和停止动画实例代码
2013/03/01 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
js中的闭包学习心得
2018/02/06 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python中的取模运算方法
2018/11/10 Python
Python实现的旋转数组功能算法示例
2019/02/23 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
安装python依赖包psycopg2来调用postgresql的操作
2021/01/01 Python
Python实现微信表情包炸群功能
2021/01/28 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
冬季安全检查方案
2014/05/23 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android