AcWing 836. 合并集合
原题链接
简单
作者:
Winkel
,
2020-10-31 15:34:27
,
所有人可见
,
阅读 259
#include<iostream>
using namespace std;
const int N = 100010;
// p[i]:结点i的父节点。p[i] = i表示自己为根结点
int p[N];
// 返回结点x所在集合的编号/x的祖宗结点
// 路径压缩:减小数的深度,增大数的宽度
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]); //如果结点x的祖宗结点不是自己,则把x的祖宗结点作为x的父节点,完成路径压缩
return p[x];
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++) p[i] = i; // 编号1~n结点的根结点均为自己
while(m--)
{
char op[2];
int a, b;
cin >> op >> a >> b;
if(op[0] == 'M') p[find(a)] = find(b);
else
{
if(find(a) == find(b)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
}