某国家有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