祖宗节点
添加的时候要先拿出根节点,对根节点连接,判断是否相等;
寻找连通块长度是也是要去找根节点的长度,因为加的时候数量都是加在根节点上了
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int n,m;
int p[N],s[N];
void init(int x)
{
p[x] = x;
s[x] = 1;
}
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
void add(int a,int b)
{
int x = find(a);
int y = find(b);
if(x != y)
{
p[x] = y;
s[y] += s[x];
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;i++)
init(i);
while(m--)
{
string a;
int x,y,z;
cin>>a;
if(a == "C")
{
cin>>x>>y;
add(x,y);
}
else if(a == "Q1")
{
cin>>x>>y;
if(find(x) == find(y))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
cin>>x;
cout<<s[find(x)]<<endl;//一定要找祖宗节点不能去找x的
}
}
return 0;
}