题目传送门:畅通工程
//简单入门的并查集
#include <iostream>
using namespace std;
int pre[1010];
int find(int x)
{
int r = x;
while (pre[r] != r)
r = pre[r];
int i = x, j;
while (i != r)
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
int main()
{
int n, m, p1, p2, i, total, f1, f2;
while (cin >> n && n)
{
total = n-1;
for (int i = 1; i<=n; i++) //从1编号到n,每个点的上级都是自己
pre[i] = i;
cin >> m;
while (m --) //共m条路,下面的代码就是join函数
{
cin >> p1>> p2; //每次读入一条路,看他的端点p1,p2是否已经在一个连通分支里了
f1 = find(p1);
f2 = find(p2); //如果不连通,那么把这两个分支连接起来
if (f1!= f2)
{
pre[f2] = f1;
total--;
}
}
cout << total<< endl;
}
return 0;
}
本文介绍了一个简单的并查集算法实现示例,用于解决“畅通工程”问题。该算法通过不断合并相连的节点来判断图中各个节点是否属于同一连通分量,并最终输出图中的连通分量数量。
200

被折叠的 条评论
为什么被折叠?



