最小生成树之kruskal

这个算法非常简单,是基于边的

从权值最小的边开始,依次加入到最小树中,如果当前边会和之前的边构成环路,那么不加入当前边,进行下一个边的加入,直到所有边都检测一遍。检测环路可以用一个顶点数组来标记,每加入一条边,就把顶点标记为1,如果当前边的两个顶点都已经被标记为1,那么表明这条边会和之前的边构成环路。


这个具体的证明还没有搞明白,代码就不写了,非常简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kruskal算法是一种用于求解最小生成树的贪心算法。它的基本思想是从图中的边集合中选择权值最小的边,并且保证选择的边不会构成环,直到选择的边数达到顶点数减1为止。下面是Kruskal算法的步骤: 1. 将图中的所有边按照权值从小到大进行排序。 2. 创建一个空的边集合,用于存储最小生成树的边。 3. 遍历排序后的边集合,依次选择权值最小的边。 4. 判断选择的边是否会构成环,如果不会构成环,则将该边加入到最小生成树的边集合中。 5. 重复步骤4,直到最小生成树的边数达到顶点数减1。 以下是一个使用Kruskal算法求解最小生成树的示例代码: ```python 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(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 += 1 x = self.find(parent, u) y = self.find(parent, v) if x != y: e += 1 result.append([u, v, w]) self.union(parent, rank, x, y) return result # 创建一个带权图 g = Graph(4) 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) # 使用Kruskal算法求解最小生成树 minimum_spanning_tree = g.kruskal() # 输出最小生成树的边集合 for u, v, weight in minimum_spanning_tree: print(f"Edge: {u} - {v}, Weight: {weight}") ``` 这段代码中,我们首先创建了一个Graph类来表示带权图。然后,我们使用add_edge方法添加图中的边。接下来,我们实现了find和union方法来判断是否构成环,并进行合并操作。最后,我们使用kruskal方法来执行Kruskal算法,并返回最小生成树的边集合。最后,我们遍历最小生成树的边集合,输出每条边的起点、终点和权值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值