并查集的操作有三步,初始化,查找祖先与合并。
并查集的初始化是让每个点的祖先指向自己。
for(int i=1;i<=n;++i) f[i]=i;
下面来写查找祖先的find函数。
int find(int x)
{
if (x == f[x]) //如果是祖先就返回
return x;
else //如果不是就递归进行查找
{
f[x] = find(f[x]);
return f[x];
}
}
下面就是合并了。
void union(int p, int q)
{
for (int i = 1; i <= m; i++)
{
// 获得p和q的组号
int t1 = find(p);
int t2 = find(q);
// 如果两个组号相等,直接返回
if (t1 == t2)
return;
//如果不相等,合并两个。
f[t1] = t2;
cnt++;
if (cnt == n - 1)
{
break;
}
}
}
附上代码:题目链接
#include <iostream>
#include <algorithm>
#include <string>
#define maxn 200005
using namespace std;
int n, m, f[maxn];
int find(int x)
{
if (x == f[x])
return x;
else
return f[x] = find(f[x]);
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
f[i] = i;
int x, y, z;
for (int i = 1; i <= m; i++)
{
cin >> z >> x >> y;
int t1 = find(x), t2 = find(y);
if (z == 1)
{
f[t1] = t2;
}
else
{
if (t1 == t2)
cout << "Y" << endl;
else
cout << "N" << endl;
}
}
return 0;
}