• 并查集学习


    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;
    }
  • 相关阅读:
    size_t类型
    sudo 安装 ——Debian 6
    Ubuntu10.10 上海交大及其他教育网更新源
    Linux 命令解决小问题
    VMware Player tools for linux 安装
    内核总结之内存管理api (转)
    volatile的使用
    二叉树层次遍历队列实现
    Ubuntu 11.04 下OpenCV安装
    Ubuntu 添加教育网更新源【转】
  • 原文地址:https://www.cnblogs.com/Elaine-DWL/p/6661848.html
Copyright © 2020-2023  润新知