并查集C++代码: #include<iostream> #include<fstream> #include<time.h> using namespace std; template<class E> class UFSet { private: int *parent; E* elements; int size; public: void input(E *e) { for(int i=0;i<size;i++) { elements[i]=e[i]; } } UFSet(int s):size(s) { parent=new int[s]; for(int i=0;i<s;i++) { parent[i]=-1; } elements=new E[s]; }; int find(int x) //查找x的父节点 { int r=x; while(parent[r]>0) //压缩路径 r=parent[r]; while(x!=r) { int temp=parent[x]; parent[x]=r; x=temp; } return r; }; void Union(int a,int b) { int r1=find(a); int r2=find(b); if(r1==r2) return;//已经在同一个集合中 if(parent[r1]<parent[r2]) { parent[r1]+=parent[r2]; parent[r2]=r1; } else { parent[r2]+=parent[r1]; parent[r1]=r2; } }; E getData(int x) { if(x>0&&x<size)return elements[x]; }; void output() { for(int i=0;i<size;i++) { if(parent[i]>0) cout<<elements[i]<<"的根是"<<elements[find(i)]<<endl; } } }; int main() { int data[12]; UFSet<int> ufs(12); for(int i=0;i<12;i++) { data[i]=i; } ufs.input(data); ufs.Union(0,4); ufs.Union(3,1); ufs.Union(6,10); ufs.Union(8,9); ufs.output(); cout<<endl; ufs.Union(7,4); ufs.Union(6,8); ufs.Union(3,5); ufs.output(); cout<<endl; ufs.Union(2,11); ufs.Union(2,11); ufs.Union(11,0); ufs.output(); return 0; }
并查集
最新推荐文章于 2025-06-19 15:48:38 发布