您的位置:首页 > 其它

并查集的实现

2016-02-29 09:59 288 查看
并查集用于解决元素集合中,元素关系的集合的问题。例如给出两两关系,最后看整个集合中,谁是一伙的,有关系的。

//
//  union_find.c
//  calc
//
//  Created by lixia on 16/2/28.
//  Copyright © 2016年 qll. All rights reserved.
//

#include <stdio.h>

int n,m,pre[1000];

int find(int x)
{
// find leader
int r = x;
while( pre[r] > 0 )
r = pre[r];
int i = x, j;

// comp
while ( i != r ) {
j = pre[i];
pre[i] = r;
i = j;
}

return r;
}

void unionset(int n, int m)
{
int fx = find(n);
int fy = find(m);

pre[fx] = fy;

}

void test(int argc, const char*argv[])
{
printf("n=");
while (scanf("%d",&n),n) {
printf("\nm=");
scanf("%d",&m);

for (int i = 0; i < n; i++) {
pre[i] = -1;
}

int x, y;
for (int j = 0; j < m; j++) {
printf("x y");
scanf("%d %d", &x, &y);
unionset(x, y);
}

int count = 0;
for (int g = 0; g < n; g++) {
if (pre[g]>0 && pre[pre[g]]==-1) {
count++;
pre[pre[g]] = -2;
}
}

for (int k = 0; k < n; k++) {
for (int l=0; l < n; l++) {
if ((k==find(l) && pre[k]<0 && k!=l) || (k==l&&pre[l]==-2)) {
printf("%d ",l);
}
}
printf("\n");
}

printf("group =%d", count);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: