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中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
python flask解析json数据不完整的解决方法
May 26 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
Python小白不正确的使用类变量实例
May 29 Python
python如何保存文本文件
Jun 07 Python
python 如何在list中找Topk的数值和索引
May 20 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 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之变量、常量学习笔记
2008/03/27 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
简单通用的JS滑动门代码
2008/12/19 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
简单实现python数独游戏
2018/03/30 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
详解Python locals()的陷阱
2019/03/26 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
党员批评与自我批评发言
2014/10/02 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
机关职员工作检讨书
2014/10/23 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python