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;
    }
  • 相关阅读:
    c# 进制
    java生成验证码
    java基础练习题
    java九九乘法表
    java list集合练习
    深入理解Java的接口和抽象类
    java 接口 练习
    java泛型详解
    Java 继承 小练习
    Java单例模式深入详解
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4986905.html
Copyright © 2011-2022 走看看