用python中类和对象知识编写编写程序:用Kruskal算法计算出无向图的最小生成树。 输入:无 输出:生成树的每条边及生成树的权值之和。
时间: 2024-03-24 10:37:08 浏览: 59
好的,下面是用 Python 中的类和对象实现 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):
x_root = self.find(parent, x)
y_root = self.find(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_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 += 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)
print("Minimum Spanning Tree:")
for u, v, weight in result:
print(f"{u} - {v}: {weight}")
print(f"Total weight: {sum([weight for _, _, weight in result])}")
if __name__ == "__main__":
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)
g.kruskal_mst()
```
在这个程序中,我们定义了一个 `Graph` 类来表示我们的无向图。这个类有一个 `__init__()` 方法来初始化我们的图,一个 `add_edge()` 方法来添加一条边,一个 `find()` 方法和一个 `union()` 方法来实现并查集,以及一个 `kruskal_mst()` 方法来实现 Kruskal 算法并打印最小生成树的每条边及权重之和。
在 `main()` 函数中,我们创建了一个图 `g`,添加了一些边,然后调用 `kruskal_mst()` 方法计算最小生成树并打印结果。
当我们运行这个程序时,将会输出:
```
Minimum Spanning Tree:
2 - 3: 4
0 - 3: 5
0 - 1: 10
Total weight: 19
```
这表明,给定的无向图的最小生成树是由边 `(2, 3)`,`(0, 3)` 和 `(0, 1)` 组成,其权重之和为 19。
阅读全文