思路
size[N]: 连通块的大小,只有祖先节点有意义
p[N]: 并查集,初始值就是它自己。
merge(int a, int b): 让a所在的集合并入到b所在的集合,b的祖先size值加上a的祖先size
注意C情况下,a和b是可能相等的,需要加入判断
暂时需要解释的就这些,其他的有问题再说吧
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int p[N], si[N], fi[N];
int n, m;
void init()
{
for (int i = 1; i <= n; i++)
{
si[i] = 1;
p[i] = i;
}
}
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void merge(int a, int b)
{
int x = find(a);
int y = find(b);
p[x] = y;
si[y] += si[x];
}
int main()
{
cin >> n >> m;
init();
while (m --)
{
string op;
int a, b;
cin >> op >> a;
if (op == "C"){
cin >> b;
if (find(a) != find(b)) merge(a, b);//这里一定要注意a, b是否处于同一集合中,要不然就使得si[y]加的更多
}
else if (op == "Q1")
{
cin >> b;
if (find(a) == find(b)) cout << "Yes" << endl;
else cout << "No" << endl;
}
else if (op == "Q2")
{
cout << si[find(a)] << endl;
}
}
}