使用并查集时,首先会存在一组不相交的动态集合 $S = left{ {{S_1},{S_2}, cdots ,{S_k}} ight}$,一般都会使用一个整数表示集合中的一个元素。
每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表。每个集合中具体包含了哪些元素是不关心的,具体选择哪个元素作为代表一般也是不关心的。我们关心的是,对于给定的元素,可以很快的找到这个元素所在的集合(的代表),以及合并两个元素所在的集合,而且这些操作的时间复杂度都是常数级的。
并查集主要包含三个操作:
1. makeSet
2. unionSet
3. find
int maxn=10010; int f[maxn],rank[maxn]; void makeSet(int n){ for(int i=0;i<=n;i++){ f[i]=i; rank[i]=0; } } int find(int r){ while(f[r]!=r) { f[x]=find(f[x]); } return f[x]; } void unionSet(int x,int y){ x=find(x);y=find(y); if(x==y) return; if(rank[x]>rank[y]){ f[y]=x; } else{ if(rank[x]==rank[y]){ rank[y]++; } f[x]=y; } }