并查集

来源:互联网 发布:mac口红哪个粉色好看 编辑:程序博客网 时间:2024/04/30 20:38
 并查集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;}