python实现Kruskal并运行
时间: 2023-08-01 22:06:06 浏览: 77
好的,让我来为您演示一下如何实现Kruskal算法并运行。Kruskal算法是一种用于求解最小生成树的贪心算法,它的基本思想是将图中的所有边按照权值从小到大进行排序,然后依次选择权值最小的边,如果这条边的两个端点不在同一个连通块中,就将它们合并成一个连通块,直到所有的点都在同一个连通块中为止。下面是代码实现:
```python
class Kruskal:
def __init__(self, V, E):
self.V = V
self.E = E
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, e = 0, 0
self.E = sorted(self.E, 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.E[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("Edges in the constructed MST:")
for u, v, weight in result:
print("%d - %d: %d" % (u, v, weight))
```
这里我们使用了一个类Kruskal来实现算法,其中V表示节点数,E表示边的列表,每条边都是一个三元组(u, v, w),表示从节点u到节点v的边的权值为w。在kruskal函数中,我们首先将边按照权值从小到大排序,然后循环选择边,如果两个端点不在同一个连通块中,就将它们合并成一个连通块,并将这条边加入到结果中。最后输出构造出来的最小生成树的边。现在我们来运行一下这段代码:
```python
V = 4
E = [[0, 1, 10], [0, 2, 6], [0, 3, 5], [1, 3, 15], [2, 3, 4]]
kruskal = Kruskal(V, E)
kruskal.kruskal()
```
输出结果为:
```
Edges in the constructed MST:
2 - 3: 4
0 - 3: 5
0 - 1: 10
```
这说明我们成功地构造出了这个图的最小生成树。
阅读全文