码迷,mamicode.com
首页 > 其他好文 > 详细

并查集学习

时间:2017-04-03 14:41:12      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:http   main   初始化   bsp   ble   count   ack   连通   int   

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;
}

 

并查集学习

标签:http   main   初始化   bsp   ble   count   ack   连通   int   

原文地址:http://www.cnblogs.com/Elaine-DWL/p/6661848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!