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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
Python面向对象编程中的类和对象学习教程
Mar 30 Python
简单学习Python time模块
Apr 29 Python
window下eclipse安装python插件教程
Apr 24 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
python解析yaml文件过程详解
Aug 30 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 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
重置版战役片段
2020/04/09 魔兽争霸
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
IE8 原生JSON支持
2009/04/13 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
Node.js中child_process实现多进程
2015/02/03 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python高阶爬虫实战分析
2018/07/29 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
django的ORM操作 增加和查询
2019/07/26 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
介绍一下常见的木马种类
2014/11/15 面试题
音乐器材管理制度
2014/01/31 职场文书
学员自我鉴定
2014/03/19 职场文书
护理心得体会范文
2016/01/22 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang