连接块中点的数量

 

 

 

 只保证根节点的size是有意义的。

pa=b。b是父节点。size[find(b)]+=size[find(a)];注意判断,如果find(a)==find(b),两个集合已经合并,就不可以让size相加,会导致数量翻倍。

#include<iostream>

using namespace std;

const int N=1e5+10;

int n,m;

int a,b;

int p[N],sizee[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;

sizee[i]=1;

}

while(m--)

{

string op;

cin>>op;

if(op=="C"){

cin>>a>>b;

if(find(a)==find(b)) continue;

 

 

sizee[find(b)]+=sizee[find(a)];

p[find(a)]=find(b);

 

}else if(op=="Q1"){

cin>>a>>b;

if(find(a)==find(b)) cout<<"Yes"<<endl;

else cout<<"No"<<endl;

}else{

cin>>a;

cout<<size[find(a)]<<endl;

}

}

return 0;

}

 

posted @ 2023-03-11 13:26  chenxinyue  阅读(11)  评论(0编辑  收藏  举报