并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并。
并查集的核心操作在于查找与合并,在查找的时候可以通过递归的方式实现路径的压缩。
并查集是对集合进行的操作,在并查集的思想基础上可以进行很多的现实世界各种关系的推演,如查找间接的朋友关系,实现朋友圈的合并等。#include<iostream> #include<stack> template<typename T> class Unionfindset { public: static const int size = 10; Unionfindset(T array[]) { std::fill(set, set+size, (T)0); std::fill(fatherunion, fatherunion+size, (T)0); std::fill(rank, rank+size, (T)0); for(int i=0;i<size;i++) { set[i] = array[i]; } } void Make_set(); T Find_set(T x); void Union(T a, T b); void Display()const; private: T set[size]; T fatherunion[size]; T rank[size]; }; template<typename T> const int Unionfindset<T>::size; template<typename T> void Unionfindset<T>::Make_set() { for(int i = 0; i < size; i++) { fatherunion[i] = set[i]; } } template<typename T> T Unionfindset<T>::Find_set(T x) { T r = x; if(r != fatherunion[r]) { fatherunion[r] = Find_set(fatherunion[r]); } return fatherunion[r]; } template<typename T> void Unionfindset<T>::Union(T a, T b) { a = Find_set(a); b = Find_set(b); if(a == b) return; if(rank[a] < rank[b]) { fatherunion[a] = b; } else { if(rank[a] == rank[b]) { ++rank[a]; } fatherunion[b] = a; } } template<typename T> void Unionfindset<T>::Display()const { std::cout<<" set: "; for(int i = 0; i< size; ++i) { std::cout<<set[i]<<"\t"; } std::cout<<std::endl; std::cout<<"fatherunion: "; for(int i = 0; i< size; ++i) { std::cout<<fatherunion[i]<<"\t"; } std::cout<<std::endl; std::cout<<" rank: "; for(int i = 0; i< size; ++i) { std::cout<<rank[i]<<"\t"; } std::cout<<std::endl; } int main() { int array[10]={0,1,2,3,4,5,6,7,8,9}; Unionfindset<int> u(array); u.Display(); u.Make_set(); u.Display(); u.Union(2,3); u.Union(7,9); u.Union(9,0); u.Union(4,3); u.Union(6,5); u.Union(1,8); u.Union(5,1); u.Union(8,2); u.Union(5,0); u.Display(); return 0; }