您的位置:首页 > 编程语言 > C语言/C++

算法:并查集的实现及简单优化

2017-07-21 01:46 260 查看
参考的《挑战程序设计竞赛》一书中的并查集的实现。

(另外,阿克曼(Ackermann)函数是什么鬼???)

int parent[MAX_N];
int height[MAX_N];

void init(int n){
for(int i=0;i<n;i++){
parent[i]=i;
height[i]=0;
}
}

int find(int x){
if(parent[x]==x){
return x;
}
else{
return parent[x]=find(parent[x]);
}
}

//非递归的并查集查找
//int find(int x){
//  int root=x,tmp;
//  while(parent[root]!=root){
//      root=parent[root];
//  }
//  while(parent[x]!=root){
//      tmp=parent[x];
//      parent[x]=root;
//      x=tmp;
//  }
//  return root;
//}

void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y) return;

if(height[x]<height[y]){
parent[x]=y;
}
else{
parent[y]=x;
if(height[x]==height[y]){
height[x]++;
}
}
}

bool same(int x,int y){
return find(x)==find(y);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 并查集 c++