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 11 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
python DataFrame 取差集实例
Jan 30 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
pytorch 自定义参数不更新方式
Jan 06 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
pycharm实现猜数游戏
Dec 07 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连接函数implode与分割explode的深入解析
2013/06/26 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
js比较日期大小的方法
2015/05/12 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
替换python字典中的key值方法
2018/07/06 Python
python实现排序算法解析
2018/09/08 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
python多线程同步实例教程
2019/08/11 Python
python小项目之五子棋游戏
2019/12/26 Python
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
课改先进个人汇报材料
2014/01/26 职场文书
餐饮投资计划书
2014/04/25 职场文书
个人授权委托书模板
2014/09/14 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
部门2014年度工作总结
2014/11/12 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书