并查集的实现

来源:互联网 发布:淘宝店怎么做百度推广 编辑:程序博客网 时间:2024/04/30 17:53

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

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


0 0