zoukankan      html  css  js  c++  java
  • 【模板】 合并集合

    传送门

    题意

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

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

    数据范围

    (1leq n,mleq 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;
    }
    
  • 相关阅读:
    RegExp实例
    Date类型之组件方法
    Date类型之继承方法
    数组常见方法下
    Math对象
    数组常见方法上
    CSS变量
    基本类型和引用类型
    Python习题集(十五)
    Python习题集(十四)
  • 原文地址:https://www.cnblogs.com/hhyx/p/13424595.html
Copyright © 2011-2022 走看看