【模板】 合并集合

传送门

题意

\(n\)个数初始每个数都在一个集合,\(m\) 个操作,

  • \((M,a,b)\),将 \(a\)\(b\) 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略
  • \((Q,a,b)\),询问 \(a\)\(b\) 的两个数是否在同一个集合中;

数据范围

\(1\leq n,m\leq 10^{5}\)

题解

并查集维护集合的查询与合并,时间复杂度为 \(O(n·log n)\)

Code

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;

int fa[N];
int n,m;
int find(int x){
    if(fa[x]!=x) fa[x]=find(fa[x]);
    return fa[x];
}
void merge(int a,int b){
    int pa=find(a),pb=find(b);
    if(pa!=pb)
        fa[pa]=pb;
}
int main(){
    cin>>n>>m;
    char op[2];
    int a,b;
    for(int i=1;i<=n;i++) fa[i]=i;
    while(m--){
        cin>>op>>a>>b;
        if(op[0]=='M')
            merge(a,b);
        else 
            if(find(a)==find(b)) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
    }
    return 0;
}
posted @ 2020-08-03 09:41  Hyx'  阅读(117)  评论(0编辑  收藏  举报