zoukankan      html  css  js  c++  java
  • (算法)并查集及其应用

    题目:

    某国家有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;
    }
  • 相关阅读:
    Python3之random模块常用方法
    Go语言学习笔记(九)之数组
    Go语言学习笔记之简单的几个排序
    Go语言学习笔记(八)
    Python3之logging模块
    Go语言学习笔记(六)
    123. Best Time to Buy and Sell Stock III(js)
    122. Best Time to Buy and Sell Stock II(js)
    121. Best Time to Buy and Sell Stock(js)
    120. Triangle(js)
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4986905.html
Copyright © 2011-2022 走看看