根据kruskal算法,实现求最小生成树代码
时间: 2023-07-22 18:27:50 浏览: 99
图的最小生成树的实现(Kruskal算法)
3星 · 编辑精心推荐
好的,以下是Kruskal算法求最小生成树的Python代码实现:
```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_parent(self, parent, i):
if parent[i] == i:
return i
return self.find_parent(parent, parent[i])
def union(self, parent, rank, x, y):
x_root = self.find_parent(parent, x)
y_root = self.find_parent(parent, y)
if rank[x_root] < rank[y_root]:
parent[x_root] = y_root
elif rank[x_root] > rank[y_root]:
parent[y_root] = x_root
else:
parent[y_root] = x_root
rank[x_root] += 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 = i + 1
x = self.find_parent(parent, u)
y = self.find_parent(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("%d - %d: %d" % (u, v, weight)))
```
这段代码中,我们首先定义了一个Graph类,其中包含了初始化函数、添加边函数、查找父节点函数、并查集合并函数以及Kruskal算法求最小生成树函数等。Kruskal算法的基本思路是将各边按权值从小到大排序,逐条加入生成树中,如果加入该边后形成了环,则舍弃该边,直到生成树中包含了所有顶点为止。
阅读全文