acwing836合并集合,并查集(模板题)
并查集主要处理:1.集合合并 2.查找两元素是否在同一集合
优雅地合并+压缩路径
int find(int a){//合并+压缩路径
if(fa[a]!=a) fa[a]=find(fa[a]);
return fa[a];
} 代码 #include <bits/stdc++.h>
using namespace std;
int n,m,a,b;
char op[5];
const int N=100005;
int fa[N];
int find(int a){
if(fa[a]!=a) fa[a]=find(fa[a]);
return fa[a];
}
int main(int argc, char** argv) {
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%s%d%d",op,&a,&b);
if(op[0]=='M') fa[find(a)]=fa[find(b)];//合并
else printf("%s\n",find(a)==find(b)?"Yes":"No");//两个元素是否在同一集合
}
return 0;
}
查看14道真题和解析
上海得物信息集团有限公司公司福利 1208人发布