zoukankan      html  css  js  c++  java
  • 并查集模板

    使用并查集时,首先会存在一组不相交的动态集合 $S = left{ {{S_1},{S_2}, cdots ,{S_k}} ight}$,一般都会使用一个整数表示集合中的一个元素。

    每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表。每个集合中具体包含了哪些元素是不关心的,具体选择哪个元素作为代表一般也是不关心的。我们关心的是,对于给定的元素,可以很快的找到这个元素所在的集合(的代表),以及合并两个元素所在的集合,而且这些操作的时间复杂度都是常数级的。

    并查集主要包含三个操作:
    1.  makeSet

    2.  unionSet

    3.  find

    int maxn=10010;
    int f[maxn],rank[maxn]; 
    
    void makeSet(int n){
        for(int i=0;i<=n;i++){
            f[i]=i;
            rank[i]=0;
        }
    }
    
    int find(int r){
        while(f[r]!=r)
        {
            f[x]=find(f[x]);    
        }
        return f[x];
    }
    
    void unionSet(int x,int y){
        x=find(x);y=find(y);
        if(x==y) return;
        if(rank[x]>rank[y]){
            f[y]=x;
        }
        else{
            if(rank[x]==rank[y]){
                rank[y]++;
            }
            f[x]=y;
        }
    }
  • 相关阅读:
    scp命令
    js代码片段
    js创建request对象与ajax请求
    多个action组成一个文件
    ng-option选项禁用
    IE日期
    ui-sortable
    P5多语言默认语言不生效BUG的解决办法
    防止多次点击提交按钮造成数据多次提交
    c#根据ip获取地理位置
  • 原文地址:https://www.cnblogs.com/dynmi/p/11311759.html
Copyright © 2011-2022 走看看