题目
思路
跟上一道题差不多,也是道模板题。计算集合中点的数量的时候,在合并的基础上把一个集合的祖宗结点的 size[ ] (也就是结点数量数组,只保证祖宗结点的 size[ ] 有意义就行)加到另一个集合的祖宗结点的 size[ ] 上就行。
上道题: [C++] AcWing 836. 合并集合-CSDN博客
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int p[N],s[N];
int n,m;
int find(int x)
{
if(p[x]!=x)
p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n>>m;
//最开始每个数各自在一个集合中,编号是1~n
//每个数的根结点就是自己
for(int i=1;i<=n;i++)
{
p[i]=i;
s[i]=1;
}
while(m--)
{
string op;
int a,b;
cin>>op;
if(op=="C")
{
cin>>a>>b;
//如果a和b已经在一个集合
if(find(a)==find(b))
continue;
s[find(b)]+=s[find(a)];
p[find(a)]=p[find(b)];
}
else if(op=="Q1")
{
cin>>a>>b;
if(find(a)==find(b))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
else if(op=="Q2")
{
cin>>a;
cout<<s[find(a)]<<endl;
}
}
return 0;
}