AcWing 837. 连通块中点的数量
原题链接
简单
作者:
AC就喝AD钙
,
2024-04-17 20:31:14
,
所有人可见
,
阅读 22
/*
- 注意1:如果使用了万能头,需要把size数组的命修改
- 注意2:在合并操作需要注意特判,如果a和b在同一个集合,则continue
- 注意3:在合并操作维护cnt数组时,要先维护数量数组,然后再进行合并操作
*/
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
int n, m;
int p[N], cnt[N];
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for(int i = 1; i <= n ; i ++)
{
p[i] = i;
cnt[i] = 1;
}
while(m --)
{
char op[2];
cin >> op;
if(op[0] == 'C')
{
int a, b;
cin >> a >> b;
if(find(a) == find(b)) continue;
// 注意这里要先维护数量,然后再合并集合
cnt[find(b)] += cnt[find(a)];
p[find(a)] = find(b);
}
else if(op[0] == 'Q' && 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;
cout << cnt[find(a)] << endl;
}
}
return 0;
}