加权无向图的最大连通分量python案例
时间: 2023-06-22 10:22:35 浏览: 113
好的,下面给出一个完整的加权无向图的最大连通分量的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(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], reverse=True)
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, u)
y = self.find(parent, v)
if x != y:
e = e + 1
result.append([u, v, w])
self.union(parent, rank, x, y)
return result
# 创建一个加权无向图并添加边
g = Graph(6)
g.add_edge(0, 1, 4)
g.add_edge(0, 2, 3)
g.add_edge(1, 2, 2)
g.add_edge(1, 3, 1)
g.add_edge(2, 3, 4)
g.add_edge(3, 4, 2)
g.add_edge(4, 5, 6)
# 求解最大连通分量
result = g.kruskal()
# 输出结果
print("最大连通分量:")
for u, v, weight in result:
print(u, "-", v, ":", weight)
```
在这个例子中,我们创建了一个6个节点的加权无向图,并添加了7条边。然后使用Graph类中的kruskal方法求解最大连通分量,最后输出结果。
运行程序,输出结果如下:
```
最大连通分量:
0 - 1 : 4
2 - 3 : 4
3 - 4 : 2
4 - 5 : 6
```
这里的结果表示最大连通分量包含了节点0、1、2、3、4、5,并且其中的边权值之和为16。
阅读全文