//查找并返回根节点
int find(int x){
if(p[x] != x) p[x] = find(p[x]); //若不是根节点的话就调用find函数查找上一个节点,并在结束时压缩路径优化
return p[x]; //返回根节点编号
}
int main(){
for(int i = 1;i <= n;i ++) p[i] = i; //将所有的根节点从1开始递增编号初始化
}
#include<iostream>
using namespace std;
const int N = 100010;
int n,m;
int p[N]; //父节点数组
//返回x对应的根节点编号
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;
while(m --){
char op[2];
int a,b;
scanf("%s%d%d",op,&a,&b);
//将a所在的整个集合插入b所在的集合中
if(op[0] == ‘M‘) p[find(a)] = find(b);
else cout << (find(a) == find(b) ? "Yes" : "No") << endl;
}
return 0;
}
原文:https://www.cnblogs.com/Xuuxxi/p/14682995.html