最小生成树 ゝ一纸荒年。 2022-02-25 14:20 253阅读 0赞 kruskal算法基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直到遍历完所有的边。 prim算法基本思路:所有节点分成两个group,一个为已经选取的selected\_node(为list类型),一个为candidate\_node,首先任取一个节点加入到selected\_node,然后遍历头节点在selected\_node,尾节点在candidate\_node的边,选取符合这个条件的边里面权重最小的边,加入到最小生成树,选出的边的尾节点加入到selected\_node,并从candidate\_node删除。直到candidate\_node中没有备选节点(这个循环条件要求所有节点都有边连接,即边数要大于等于节点数-1,循环开始前要加入这个条件判断,否则可能会有节点一直在candidate中,导致死循环)。 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+1,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] = [] print(group) 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()) 初始图片: ![SouthEast][] 文章转载,原博客地址:[https://blog.csdn.net/mashijia986/article/details/79100925][https_blog.csdn.net_mashijia986_article_details_79100925] [SouthEast]: /images/20220225/0e2ce195d0c04b30861ec9eabd2005cd.png [https_blog.csdn.net_mashijia986_article_details_79100925]: https://blog.csdn.net/mashijia986/article/details/79100925
相关 最小生成树 最小生成树定义: 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即![(u, v)\\in E][u_ v_in E]),而 末蓝、/ 2022年09月20日 15:18/ 0 赞/ 181 阅读
相关 生成树相关问题(最小生成树变形,次小生成树,最小度限度生成树,极差最小生成树) 生成树相关问题(最小生成树变形,次小生成树,最小度限度生成树,极差最小生成树) 视频:[https://www.bilibili.com/video/BV1G64y187ke Bertha 。/ 2022年09月12日 05:52/ 0 赞/ 185 阅读
相关 最小生成树 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树在n个顶点的情形下,有n-1条边。生成树是对连 忘是亡心i/ 2022年08月03日 05:28/ 0 赞/ 202 阅读
相关 最小生成树 邻接矩阵建图+prim朴素[算法][Link 1] 代码通过HDU1102 \[cpp\] [view plain][] [copy][view plain] 1. 超、凢脫俗/ 2022年06月09日 04:27/ 0 赞/ 50 阅读
相关 最小生成树 有n个城市,m条道路,现在输入n到m的道路的长度,用最少的边将图连接,输出让图连接的最小值 这道题我研究了好长时间才把答案看明白,现在给大家分享一下 具体代码如下 爱被打了一巴掌/ 2022年05月30日 08:56/ 0 赞/ 164 阅读
相关 最小生成树 设G = (V,E)是无向连通带权图,即一个网络。E中的每一条边(v,w)的权为c\[v\]\[w\]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成 红太狼/ 2022年05月24日 11:41/ 0 赞/ 252 阅读
相关 最小生成树 问题提出: 要在n个城市间建立通信联络网。顶点:表示城市,权:城市间通信线路的花费代价。希望此通信网花费代价最小。 问题分析: 答案只能从生成树中找,因为要做到任何 雨点打透心脏的1/2处/ 2022年03月18日 12:28/ 0 赞/ 271 阅读
相关 最小生成树 kruskal算法基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直到遍历完所有的边。 p ゝ一纸荒年。/ 2022年02月25日 14:20/ 0 赞/ 254 阅读
相关 最小生成树 最小生成树 什么是最小生成树 给定一张无向带权图G=(V,E,W),从中挑选出|V|-1条边,使得V中任意两点都有直接或者间接的路径 显然,最后得到的子 浅浅的花香味﹌/ 2021年12月22日 01:57/ 0 赞/ 301 阅读
相关 最小生成树 Jungle Roads [http://poj.org/problem?id=1251][http_poj.org_problem_id_1251] Descrip 逃离我推掉我的手/ 2021年11月29日 22:28/ 0 赞/ 401 阅读
还没有评论,来说两句吧...