• 模板


    用于较大规模数据的非递归的启发式合并/按秩合并并查集。

    解决爆栈RE问题。

    顺带连通块计数。

    ```cpp namespace Disjoint_Set_Union { const int MAXN=5000;
    int par[MAXN+5];
    int rak[MAXN+5];
    
    int cnt;
    
    void init(int n) {
        for(int i=1; i<=n; i++) {
            par[i]=i;
            rak[i]=1;
        }
        cnt=n;
    }
    
    int find_par(int x) {
        int k,pk,r;
        r=x;
        while(r!=par[r])
            r=par[r];       //x查到根,保存为r
        k=x;
        while(k!=r) {       //循环处理x的祖先直到根
            pk=par[k];      //保存k的父亲后把k接入r
            par[k]=r;
            k=pk;           //处理k的父亲
        }
        return r;
    }
    
    bool union_set(int x,int y) {
        int fx=find_par(x);
        int fy=find_par(y);
        if(fx==fy) {
            return false;
        } else {
            if(rak[fx]<=rak[fy]) {
                if(rak[fx]==rak[fy])
                    rak[fy]++;
                par[fx]=fy;
            } else {
                par[fy]=fx;
            }
            cnt--;
            return true;
        }
    }
    
    bool is_the_same_set(int x,int y) {
        int fx=find_par(x);
        int fy=find_par(y);
        return fx==fy;
    }
    

    }

    using namespace Disjoint_Set_Union;

    </details>
    
    标准模板题:
    <details>
    ```cpp
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int n,m,x,y,z;
    
    namespace Disjoint_Set_Union {
        const int MAXN=10000;
    
        int par[MAXN+5];
        int rak[MAXN+5];
    
        void init(int n) {
            for(int i=1; i<=n; i++) {
                par[i]=i;
                rak[i]=1;
            }
        }
    
        int find_par(int x) {
            int k,pk,r;
            r=x;
            while(r!=par[r])
                r=par[r];       //x查到根,保存为r
            k=x;
            while(k!=r) {       //循环处理x的祖先直到根
                pk=par[k];      //保存k的父亲后把k接入r
                par[k]=r;
                k=pk;           //处理k的父亲
            }
            return r;
        }
    
        bool union_set(int x,int y) {
            int fx=find_par(x);
            int fy=find_par(y);
            if(fx==fy) {
                return false;
            } else {
                if(rak[fx]<=rak[fy]) {
                    if(rak[fx]==rak[fy])
                        rak[fy]++;
                    par[fx]=fy;
                } else {
                    par[fy]=fx;
                }
                return true;
            }
        }
    
        bool is_the_same_set(int x,int y) {
            int fx=find_par(x);
            int fy=find_par(y);
            return fx==fy;
        }
    
    }
    
    using namespace Disjoint_Set_Union;
    
    int main() {
        scanf("%d%d",&n,&m);
    
        init(n);
    
        for(int i=0; i<m; i++) {
            scanf("%d%d%d",&z,&x,&y);
            if(z==1) {
                union_set(x,y);
            } else {
                printf("%c
    ",is_the_same_set(x,y)?'Y':'N');
            }
        }
    }
    
  • 相关阅读:
    使用IntelliJ IDEA配置Tomcat(入门)
    关于hive异常:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStor
    完整过程解决 ERROR 1045 (28000): Access denied for user 'mysql'@'localhost' (using password: NO)
    Hadoop伪分布式配置
    Spark_scala_Maven项目创建
    Spark-WordCount
    tesseract-ocr的安装及使用
    解决selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in P
    python第三方库资源
    kafka伪分布式配置
  • 原文地址:https://www.cnblogs.com/Yinku/p/10787540.html
Copyright © 2020-2023  润新知