AcWing 836. 合并集合-C++
原题链接
简单
作者:
码
,
2020-06-16 17:14:00
,
所有人可见
,
阅读 670
注释版
#include<iostream>
using namespace std;
const int N=1e5+10;
int f[N];
int find(int x)//返回x的根节点
{
//如果f[x]不是根节点
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int main()
{
int n,m;
cin.tie(0);
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) f[i]=i;//一开始1-n的每个数均为一个单独的集合 其每个数此时在树中均为根节点
while(m--)
{
char op;
cin>>op;
int a,b;
cin>>a>>b;
if(op=='M')
{
//当a和b所在集合的根节点不相等时,a和b不在一个集合
//合并时,a集合的根节点的父节点指向b集合的根节点
if(find(a)!=find(b)) f[find(a)]=find(b);
}
else
{
//当a和b所在集合的根节点不相等时,a和b不在一个集合
//返回No 否则返回true
if(find(a)!=find(b)) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
}
无注释版
#include<iostream>
using namespace std;
const int N=1e5+10;
int p[N];
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;
while(m--)
{
char op;
int a,b;
cin>>op>>a>>b;
if(op=='M')
{
if(find(a)!=find(b)) p[find(a)]=find(b);
}
else
if(find(a)==find(b)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}