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使用turtule画五角星的方法
Jul 09 Python
python3.5使用tkinter制作记事本
Jun 20 Python
Python生成器以及应用实例解析
Feb 08 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
对python捕获ctrl+c手工中断程序的两种方法详解
Dec 26 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
Aug 02 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
Python各种扩展名区别点整理
Feb 27 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
python实现磁盘日志清理的示例
Nov 05 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
表单JS弹出填写提示效果代码
2011/04/16 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
a标签置灰不可点击的实现方法
2017/02/06 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
vue组件实现进度条效果
2018/06/06 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
python使用mysql数据库示例代码
2017/05/21 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
情侣吵架检讨书
2014/02/05 职场文书
爱心倡议书范文
2014/05/12 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
领导参观欢迎词
2015/01/26 职场文书
少年犯观后感
2015/06/11 职场文书
公司晚宴祝酒词
2015/08/11 职场文书