成仙之路−> 算法基础课题解
思路:
1. 用并查集 find(x) 作为区别于其他连通块的标志
2. 注意:合并两个连通块时,需要先合并连通块中点的数量,再合并两个集合
3. 合并连通块的数量时,数量必须是加在父亲身上
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,m;
int p[N],s[N];
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n>>m;
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;
if(find(a)==find(b)) continue;
s[find(b)]+=s[find(a)];
p[find(a)]=find(b);
}
//判断两个点是否在同一个连通块
if(op=="Q1")
{
cin>>a>>b;
cout<<(find(a)==find(b)?"Yes":"No")<<endl;
}
//查询连通块中点的数量
if(op=="Q2")
{
cin>>a;
cout<<s[find(a)]<<endl;
}
}
return 0;
}