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 paramiko实现ssh远程访问的方法
Dec 03 Python
Python采集腾讯新闻实例
Jul 10 Python
详解Python中的多线程编程
Apr 09 Python
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 Python
python如何实现反向迭代
Mar 20 Python
Python高级特性与几种函数的讲解
Mar 08 Python
python输入多行字符串的方法总结
Jul 02 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
详解Python IO编程
Jul 24 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
Python+Appium实现自动抢微信红包
May 21 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
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
python实现图片处理和特征提取详解
2017/11/13 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
Django封装交互接口代码
2020/07/12 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
集团公司总经理岗位职责
2013/12/20 职场文书
企业宣传口号
2014/06/12 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
安全教育第一课观后感
2015/06/17 职场文书