python最小生成树kruskal与prim算法详解

 更新时间:2019年01月17日 14:15:05   作者:风云pgg  
这篇文章主要为大家详细介绍了python最小生成树kruskal与prim算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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())

初始的图如下。

运行结果如下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Django实现支付宝付款和微信支付的示例代码

    Django实现支付宝付款和微信支付的示例代码

    支付宝支付和微信支付是当今互联网产品常用的功能,这篇文章主要介绍了Django实现支付宝付款和微信支付的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • python 爬取小说并下载的示例

    python 爬取小说并下载的示例

    这篇文章主要介绍了python 爬取小说并下载的示例,帮助大家更好的理解和学习python爬虫,感兴趣的朋友可以了解下
    2020-12-12
  • python IO多路复用之epoll详解

    python IO多路复用之epoll详解

    这篇文章主要为大家详细介绍了python IO多路复用之epoll,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • python邮件中附加文字、html、图片、附件实现方法

    python邮件中附加文字、html、图片、附件实现方法

    在本篇文章里小编给大家整理了一篇关于python邮件中附加文字、html、图片、附件实现方法,有兴趣的朋友们跟着学习下。
    2021-01-01
  • 基于Python+Pygame实现经典赛车游戏

    基于Python+Pygame实现经典赛车游戏

    这篇文章主要为大家分享了一个基于Python和Pygame实现的赛车小游戏,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下
    2022-04-04
  • python munch库的使用解析

    python munch库的使用解析

    munch是Bunch包的分支,提供类似的功能。99%的工作都是由他完成的,而前叉的创建主要是因为对原始代码的修复和维护缺乏响应能力。Munch是支持属性样式访问的字典,本文将讲解munch库的使用
    2021-05-05
  • 使用Python求解带约束的最优化问题详解

    使用Python求解带约束的最优化问题详解

    今天小编就为大家分享一篇使用Python求解带约束的最优化问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 用Python解决计数原理问题的方法

    用Python解决计数原理问题的方法

    计数原理是数学中的重要研究对象之一,分类加法计数原理、分步乘法计数原理是解决计数问题的最基本、最重要的方法,也称为基本计数原理,它们为解决很多实际问题提供了思想和工具。本文教大家怎么用Python解决在数学中遇到的计数原理问题。
    2016-08-08
  • 使用pycharm在本地开发并实时同步到服务器

    使用pycharm在本地开发并实时同步到服务器

    这篇文章主要介绍了使用pycharm在本地开发并实时同步到服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Django基于客户端下载文件实现方法

    Django基于客户端下载文件实现方法

    这篇文章主要介绍了Django基于客户端下载文件实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论