//查并集
/*
一共有n个数,编号是1~n,最开始每个数各自在一个集合中。
现在要进行m个操作,操作共有两种:
“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
“Q a b”,询问编号为a和b的两个数是否在同一个集合中;
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4
Yes
No
Yes
*/
#include<iostream>
#include<cstring>
using namespace std;
const int N=100010;
int p[N]; //存储每个店的祖宗节点
//返回x所在集合的祖宗节点下标,从1开始,并内部更新p[x]为a节点的祖先节点
int find(int a){
if(p[a]!=a)
p[a]=find(p[a]);
return p[a];
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
p[i]=i;
int a,b;
char op[2];
while(m--){
cin>>op>>a>>b;
if(op[0]=='M')p[find(a)]=find(b);
else
{
if(find(a)==find(b))
cout<<"Yes\n";
else
cout<<"No\n";
}
}
return 0;
}
并查集
最新推荐文章于 2021-08-05 21:15:11 发布