优化代码def Kruskal(n, m, edges): edges.sort(key=lambda edges: int(edges[2])) edges_num = 0 res = [] for i in range(m): if edges_num == n - 1: break if unite(edges[i][0], edges[i][1]): res.append(edges[i]) edges_num += 1 return def found(node, fa=None): if fa[node] == node: return node else: fa[node] = found(fa[node]) return fa[node] def unite(node1, node2, fa=None): node1 = found(node1) node1 = found(node1) if node1 == node2: return False else: fa[node1] = node2 return True m = 12 # 边数 n = 7 # 顶点个数 di = {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G'} fa = [_ for _ in range(n)] edges = [[0, 1, 2], [0, 3, 5], [0, 5, 8], [1, 2, 7], [1, 3, 7], [1, 4, 2], [2, 4, 3], [3, 4, 6], [3, 5, 7], [3, 6, 3], [4, 6, 4], [5, 6, 4]] res = Kruskal(n, m, edges) s = 0 for edge in res: print(f'{di[edge[0]]}->{di[edge[1]]}:{edge[2]}') s += edge[2] print(f'权值:{s}')

时间: 2024-04-28 14:25:14 浏览: 9
这段代码是一个Kruskal算法的实现,用于求解最小生成树(MST)问题。在这段代码中,输入参数n表示图中节点的个数,m表示图中边的个数,edges是一个列表,其中每个元素为一个长度为3的列表,表示一条边的起点、终点和权值。输出结果res为一个列表,包含最小生成树中的所有边。 该算法的核心思想是通过对边进行排序并逐一加入到生成树中,直到生成树中包含了所有的节点,同时保证加入的边不会构成环。具体实现中使用并查集来维护节点之间的连通性,以判断加入的边是否与生成树中的边构成环。 在代码实现方面,可以对输入的边列表进行排序,以便按照从小到大的顺序逐一加入到生成树中。同时可以使用路径压缩的方式来优化并查集的查找过程,以减少时间复杂度。代码中的输出部分将最小生成树中的边以及其权值打印出来,方便查看和验证结果。 这段代码的一个改进点是可以使用较高效的并查集实现来优化查找和合并的过程,以进一步提高算法的效率。同时,对于较大规模的图,可以考虑使用堆来代替列表来存储边,以减少排序的时间复杂度。
相关问题

def Kruskal(n,m,edges): edges.sort(key=lambda edges:int(edges[2])) edge_num=0 res=[] for i in range(m): if edge_num==n-1: break if unite(edges[i][0],edges[i][1]): res.append(edges[i]) edge_num+=1 return res def found(node): if fa[node]==node: return node else: fa[node]=found(fa[node]) return fa[node] def unite(node1,node2): node1=found(node1) node2=found(node2) if node1==node2: return False else: fa[node1]=node2 return True m=12 n=7 di={0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',6:'G'} fa=[_ for _ in range(n)] edges=[[0,1,2],[0,3,5],[0,5,8], [1,2,7],[1,3,7],[1,4,2], [2,4,3],[3,4,6],[3,5,7], [3,6,3],[4,6,4],[5,6,4]] res=Kruskal(n,m,edges) s=0 for edge in res: print(f'{di[edge[0]]}-{di[edge[1]]}:{edge[2]}') s+=edge[2] print(f'权值:{s}')

这是一个Kruskal算法的实现,用于求解无向图的最小生成树。其中,n表示节点数,m表示边数,edges表示边的信息,每条边表示为一个列表,包含三个元素,分别是两个节点和边的权值。这段代码会将所有边按照权值从小到大排序,然后依次加入到生成树中,直到生成树的边数达到n-1为止。在加入每一条边之前,会判断这条边的两个节点是否已经连通,如果已经连通,则不加入该边,否则加入该边,并将这两个节点合并。最后输出生成树的边以及总权值。

优化下列代码from collections import defaultdict class Graph: def __init__(self, vertices): self.V = vertices self.graph = [] def add_edge(self, u, v, w): self.graph.append([u, v, w]) def find(self, parent, i): if parent[i] == i: return i return self.find(parent, parent[i]) def union(self, parent, rank, x, y): xroot = self.find(parent, x) yroot = self.find(parent, y) if rank[xroot] < rank[yroot]: parent[xroot] = yroot elif rank[xroot] > rank[yroot]: parent[yroot] = xroot else: parent[yroot] = xroot rank[xroot] += 1 def kruskal_mst(self): result = [] i = 0 e = 0 self.graph = sorted(self.graph, key=lambda item: item[2]) parent = [] rank = [] for node in range(self.V): parent.append(node) rank.append(0) while e < self.V - 1: u, v, w = self.graph[i] i = i + 1 x = self.find(parent, u) y = self.find(parent, v) if x != y: e = e + 1 result.append([u, v, w]) self.union(parent, rank, x, y) print("Following are the edges in the constructed MST") for u, v, weight in result: print("{0} - {1}: {2}".format(u, v, weight)) g = Graph(5) g.add_edge(0, 1, 10) g.add_edge(0, 2, 6) g.add_edge(0, 3, 5) g.add_edge(1, 3, 15) g.add_edge(2, 3, 4) g.kruskal_mst()

以下是对代码的优化建议: 1. 将图的边列表存储为 defaultdict(list) 对象,这样可以更方便地添加边和查找边。 2. 将 find 和 union 方法改为静态方法,这样就不需要在类实例化之后再调用。 3. 使用 Python 自带的 zip 函数来遍历边列表,可以使代码更加简洁。 4. 将 print 输出改为返回结果,这样可以使代码更加可复用和灵活。 综上所述,以下是优化后的代码: ```python from collections import defaultdict class Graph: def __init__(self, vertices): self.V = vertices self.graph = defaultdict(list) def add_edge(self, u, v, w): self.graph[u].append((v, w)) self.graph[v].append((u, w)) @staticmethod def find(parent, i): if parent[i] == i: return i return Graph.find(parent, parent[i]) @staticmethod def union(parent, rank, x, y): xroot = Graph.find(parent, x) yroot = Graph.find(parent, y) if rank[xroot] < rank[yroot]: parent[xroot] = yroot elif rank[xroot] > rank[yroot]: parent[yroot] = xroot else: parent[yroot] = xroot rank[xroot] += 1 def kruskal_mst(self): result = [] i = 0 e = 0 parent = [i for i in range(self.V)] rank = [0] * self.V edges = sorted((w, u, v) for u in self.graph for v, w in self.graph[u]) while e < self.V - 1: w, u, v = edges[i] i += 1 x = Graph.find(parent, u) y = Graph.find(parent, v) if x != y: e += 1 result.append((u, v, w)) Graph.union(parent, rank, x, y) return result ``` 使用示例: ```python g = Graph(5) g.add_edge(0, 1, 10) g.add_edge(0, 2, 6) g.add_edge(0, 3, 5) g.add_edge(1, 3, 15) g.add_edge(2, 3, 4) mst = g.kruskal_mst() print("Following are the edges in the constructed MST") for u, v, weight in mst: print("{0} - {1}: {2}".format(u, v, weight)) ```

相关推荐

最新推荐

recommend-type

华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip

华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip
recommend-type

java 游戏飞翔的小鸟

java 制作游戏 飞翔的小鸟
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

已知n个人(以编号0,1,2,3...n-1分别表示)围坐在一张圆桌周围。从编号为0的人开始报数1,数到m的那个人出列;他的下一个人又从1开始报数,数到m+1的那个人又出列(每次报数值加1);依此规律重复下去,直到圆桌周围的人全部出列。用递归方法解决

这个问题可以使用递归方法解决。下面是一个思路: 1. 定义一个函数,接收三个参数:n、m、i,表示还剩下n个人,每次数到m时出列,当前报数的人是i; 2. 如果n=1,返回i,即最后留下的那个人的编号; 3. 否则,计算出下一个出列的人的编号j,通过递归调用函数解决n-1个人的问题,其结果为k; 4. 如果k < j,即当前i之后出列的人的编号为k,需要将k转换为在i之前出列的编号,返回值为 k+(n-1); 5. 如果k>=j,即当前i之后出列的人的编号为k,返回值为 k-(j-1); 下面是对应的Python代码: ```python def josephus(n, m, i):