用 c ++语言, 采用破圈法求一个带权连通图的最小生成树,并测试。
时间: 2024-03-10 10:49:01 浏览: 124
以下是使用C++实现破圈法求解最小生成树的示例代码:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 100010, M = 200010;
int n, m;
int p[N];
struct Edge
{
int a, b, w;
bool operator< (const Edge& t) const
{
return w < t.w;
}
}edges[M];
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m;
for (int i = 0; i < m; i ++)
cin >> edges[i].a >> edges[i].b >> edges[i].w;
sort(edges, edges + m);
for (int i = 1; i <= n; i ++)
p[i] = i;
int res = 0, cnt = 0;
for (int i = 0; i < m; i ++)
{
int a = edges[i].a, b = edges[i].b, w = edges[i].w;
a = find(a), b = find(b);
if (a != b)
{
p[a] = b;
res += w;
cnt ++;
}
}
if (cnt < n - 1) puts("impossible");
else cout << res << endl;
return 0;
}
```
在上述代码中,我们使用了结构体`Edge`来表示图中的边,其包含起点、终点和权值。首先,我们读入图的节点数和边数,然后读入每条边的信息,并按照权值从小到大排序。接着,我们初始化每个节点的祖先为它本身,遍历每条边,如果该边连接的两个节点不在同一个连通块中,就将这条边加入最小生成树中,并将这两个节点合并成一个连通块。最后,如果最小生成树的边数小于n-1,则说明无法构成一颗生成树,输出"impossible";否则输出最小生成树的总权值。
阅读全文