基础实验4-2.8 部落 (25分)--并查集

 解题思路:并查集思想

#include <stdio.h>
int f[10001];
void Init(int n) {
    int i;
    for(i=0; i<n; i++) {
        f[i]=i;
    }
}
int getf(int x) {
    if(f[x]==x)
        return x;
    return f[x]=getf(f[x]);
}
int check(int x,int y) {
    if(getf(x)==getf(y))
        return 1;
    return 0;
}
void Union(int x,int y) {
    int f1=getf(x);
    int f2=getf(y);
    f[f2]=f1;
}
int main() {
    int n;
    scanf("%d",&n);
    int i,j;
    Init(10001);
    int max=0;
    for(i=0; i<n; i++) {
        int m;
        scanf("%d",&m);
        int x[m];
        for(j=0; j<m; j++) {
            scanf("%d",&x[j]);
            if(x[j]>max)
                max=x[j];
        }
        for(j=1; j<m; j++) {
            Union(x[j-1],x[j]);
        }
    }
    int cnt=0;
    for(i=1; i<=max; i++) {
        if(f[i]==i)
            cnt++;
    }
    printf("%d %d\n",max,cnt);
    int k;
    scanf("%d",&k);
    int a,b;
    for(j=0; j<k; j++) {
        scanf("%d %d",&a,&b);
        if(check(a,b))
            printf("Y\n");
        else
            printf("N\n");
    }
}

猜你喜欢

转载自www.cnblogs.com/snzhong/p/12456141.html