并查集学习

Posted Elaine_DWL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集学习相关的知识,希望对你有一定的参考价值。

HOJ1232来学习并查集

#include<iostream>
#include<vector>
using namespace std;
//封装好的并查集 
class UF{//union find
    private:
        vector<int> v;//存储各个结点   v[i]=j  表示 第i个结点的代表元是j(所在树的根结点) 
    public:
        //初始化 
        UF(int n){//初始化  总共有n个结点  刚开始的时候v[i]=i 
            for(int i=0;i<=n;i++){
                v.push_back(i);
            }
        }
        //根结点的查找 
        int Find(int x){//查找x所在树的代表元(根结点) 
            for(;;){
                if(v[x]!=x)
                    x=v[x];
                else
                    return x;
            }
        }
        //根结点的查找(递归) 
        int Find2(int x){//递归的方法来找根结点 
            if(v[x]==x) return x;
            else return Find2(v[x]); 
        }
        //两棵树的合并 
        bool Union(int x,int y){//把x和y合并 
            x=Find(x);
            y=Find(y);
            if(x==y)
                return false;
            else{
                v[x]=y;
                return true;
            }
        }        
};
int main(){
    int n,m,src,dest,root,count;
    while(cin>>n&&n!=0){
        UF uf(n);//n是城镇个数   m是当前公路个数 
        cin>>m;
        
        //输入边  构造并查集,并查集的构造 
        while(m--){
            cin>>src>>dest;//输入边的两个顶点 
            if(uf.Find(src)!=uf.Find(dest)){//如果这两个点不能连通, 
                uf.Union(src,dest);//把这个量结点所在的树  合并 
            }
        } 
        //逐个结点(城镇)检查是否连通,如果不连通就修一条路使她连通 
        count=0;
        root=uf.Find(1);
        for(int i=2;i<=n;i++){
            if(UF.Find(i)!=root){
                uf.Union(i,1);
                count++;
            }
            cout<<count<<endl;
        }
    }
    return 0;
}

 

以上是关于并查集学习的主要内容,如果未能解决你的问题,请参考以下文章

并查集学习总结

第一个算法项目 | JS实现并查集迷宫算法Demo学习

并查集——新手学习记录

并查集学习笔记

并查集学习

数据结构 ---[实现并查集(UnionFind)]