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;
}

posted @ 2011-04-27 10:30  Pengchao Bai  阅读(144)  评论(0编辑  收藏  举报