Disjoint Sets 并查集
#include <iostream>
using namespace std;
const int N = 1000;
int p[N],rank[N];
void init(int n){//把每个点所在集合初始化为其自身
for(int i=1;i<=n;i++){
p[i]=i;
rank[i]=0;
}
}
int find(int i){//查找元素所在的集合,即根节点
if(p[i]!=i)
p[i]=find(p[i]);
return p[i];
}
void merge(int i, int j){//将两个元素所在的集合合并为一个集合。
i=find(i);
j=find(j);
if(i==j) return ;//合并之前,应先判断两个元素是否属于同一集合
if(rank[i]>rank[j]){
p[j]=i;
}
else if(rank[i]<rank[j]){
p[i]=j;
}
else{
p[j]=i;
rank[i]++;
}
}
int main(){
return 0;
}