码迷,mamicode.com
首页 > 编程语言 > 详细

(算法)并查集及其应用

时间:2015-11-22 23:32:20      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

题目:

某国家有N个小岛组成,经过多年的基础设施累积,若该岛屿之间建立若干桥梁,先重新完善该国的行政区划,规定只要有桥梁连接的岛屿则归属于同一个城市(可以通过其他岛屿中转),问该国可以划分为多少个城市?

思路:

并查集

代码:

#include<iostream>
#include<set>
using namespace std;

class UnionFindSet{
    private:
        int m_nN;
        int* m_pParent;
    public:
        UnionFindSet(int n);
        ~UnionFindSet();
        void Union(int i,int j);
        int Find(int i);
        void Print() const;
};

UnionFindSet::UnionFindSet(int n){
    m_nN=n;
    m_pParent=new int[m_nN];
    for(int i=0;i<m_nN;i++)
        m_pParent[i]=i;
}

UnionFindSet::~UnionFindSet(){
    if(m_pParent!=NULL){
        delete[] m_pParent;
        m_pParent=NULL;
    }
}

int UnionFindSet::Find(int i){
    if(i<0 || i>=m_nN)
        return -1;
    int root=i;
    while(root!=m_pParent[root])
        root=m_pParent[root];

    int t=i;
    int p;
    while(t!=root){
        p=m_pParent[t];
        m_pParent[t]=root;
        t=p;
    }
    return root;    
}

void UnionFindSet::Union(int i,int j){
    if(i<0 || i>=m_nN || j<0 || j>=m_nN)
        return;
    int ri=Find(i);
    int rj=Find(j);
    if(ri!=rj)
        m_pParent[ri]=rj;
}

int calcComponent(){
    int M,N;
    int c1,c2;
    cin>>M>>N;
    UnionFindSet ufs(N);
    
    for(int i=0;i<M;i++){
        cin>>c1>>c2;
        ufs.Union(c1,c2);
    }

    set<int> numOfComponent;
    for(int i=0;i<N;i++){
        int p=ufs.Find(i);
        numOfComponent.insert(p);
    }

    return numOfComponent.size();
}

int main(){
    cout<< calcComponent()<<endl;

    return 0;
}

 

(算法)并查集及其应用

标签:

原文地址:http://www.cnblogs.com/AndyJee/p/4986905.html

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