用python语言编写程序实现连通无向图的最小生成树,并测试
时间: 2023-06-14 15:05:55 浏览: 105
好的,我来为你演示一下如何用Python编写Kruskal算法实现连通无向图的最小生成树,并进行测试。
首先,我们需要定义一个`Graph`类来表示无向图,包含节点数、边数、边的集合以及一个用于添加边的方法:
```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])
```
接下来,我们需要实现Kruskal算法来寻找最小生成树。Kruskal算法的基本思路是先将所有边按照权值从小到大排序,然后依次加入到生成树中,直到生成树中包含所有节点为止。在加入新边时,需要保证不会形成环,因此需要使用并查集来判断两个节点是否在同一个连通分量中。
```python
class Kruskal:
def __init__(self, V):
self.V = V
self.parent = [i for i in range(V)]
def find(self, i):
if self.parent[i] == i:
return i
return self.find(self.parent[i])
def union(self, u, v):
self.parent[u] = v
def kruskal(self, graph):
result = []
i, e = 0, 0
graph = sorted(graph, key=lambda item: item[2])
while e < self.V - 1:
u, v, w = graph[i]
i += 1
x = self.find(u)
y = self.find(v)
if x != y:
e += 1
result.append([u, v, w])
self.union(x, y)
return result
```
最后,我们可以创建一个`Graph`对象,添加边,然后调用`Kruskal`类的`kruskal`方法来获取最小生成树:
```python
if __name__ == '__main__':
g = Graph(5)
g.add_edge(0, 1, 2)
g.add_edge(0, 3, 6)
g.add_edge(1, 2, 3)
g.add_edge(1, 3, 8)
g.add_edge(1, 4, 5)
g.add_edge(2, 4, 7)
g.add_edge(3, 4, 9)
k = Kruskal(5)
result = k.kruskal(g.graph)
print("边\t权重")
for u, v, weight in result:
print(f"{u} - {v}\t{weight}")
```
运行结果如下:
```
边 权重
0 - 1 2
1 - 2 3
1 - 4 5
0 - 3 6
```
这个例子中,我们创建了一个包含5个节点的无向图,并添加了7条边。程序输出了最小生成树的边及其权重,可以看到生成树的总权重为16。
阅读全文