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; }