AcWing 837. 连通块中点的数量
原题链接
简单
作者:
1196399230
,
2020-08-26 01:09:42
,
所有人可见
,
阅读 357
#include <iostream>
using namespace std;
const int N = 100010;
int p[N],si[N];// p 存放的是当前节点的父亲节点,si存放的是 当前节点的大小
int find(int x)
{
//父亲节点是自身的时候说明只有一个节点
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i ++)
{
p[i] = i;
si[i] = 1;//初始每个节点连通块的大小都是1
}
while(m --)
{
char op[5];
scanf("%s",op);
if(op[0] == 'C'){
int a,b;
cin >> a >> b;
if(find(a) == find(b)) continue;//如果已经是同一个连通块了 就没必要进行下去
/*
这一步尤其重要!!!!!!
目的是,让b所在的连通块的大小,加上a的连通块
所以需要先加上 a 连通块的大小
然后在让 a b 两个连在一起,
不然先连再加的话 就会 变成 加上已经连通的大小了
*/
si[find(b)] += si[find(a)];
p[find(a)] = find(b);
}else if(op[1] == '1'){
int a,b;
cin >> a >> b;
if(find(a) == find(b)) cout << "Yes" << endl;
else cout << "No" << endl;
}else{
int a;
cin >> a;
printf("%d\n",si[find(a)]);
}
}
}