并查集用于解决元素集合中,元素关系的集合的问题。例如给出两两关系,最后看整个集合中,谁是一伙的,有关系的。
//
// 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);
}
}