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 27 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
python对csv文件追加写入列的方法
Aug 01 Python
Python编写带选项的命令行程序方法
Aug 13 Python
python反转列表的三种方式解析
Nov 08 Python
python 实现二维列表转置
Dec 02 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
python super函数使用方法详解
Feb 14 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
opencv实现图像平移效果
Mar 24 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
Zerg基本策略
2020/03/14 星际争霸
PHP字符串的连接的简单实例
2013/12/30 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
Python中time模块和datetime模块的用法示例
2016/02/28 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
档案信息化建设方案
2014/05/16 职场文书
企业负责人任命书
2014/06/05 职场文书
人才市场接收函
2015/01/30 职场文书
户外活动总结
2015/02/04 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
用javascript制作qq注册动态页面
2021/04/14 Javascript
Python使用openpyxl模块处理Excel文件
2022/06/05 Python