hdu1213

#include <stdio.h>
#include <string.h>
#define  MAXN 1100
int parent[MAXN];
int n,m;
void UFset(){
    for(int i=1;i<=n;++i)
        parent[i]=-1;
}
int Find(int x){
    int s;
    for(s=x;parent[s]>=0;s=parent[s])
        ;    
    while(s!=x){
        int tmp=parent[x];
        parent[x]=s;
        x=tmp;
    }
    return s;
}
void Union(int R1,int R2){
    int r1=Find(R1),r2=Find(R2);
    int tmp=parent[r1]+parent[r2];
    if(parent[r1]>parent[r2]){
        parent[r1]=r2;
        parent[r2]=tmp;
    }
    else{
        parent[r2]=r1;
        parent[r1]=tmp;
    }
}
int main(){
    int t;
    int i,j;
    int t1,t2;
    int sign[1100];
    int res;
    while(~scanf("%d",&t)){
        while(t--){
            res=0;
            memset(sign,0,sizeof(sign));
            scanf("%d%d",&n,&m);
            UFset();
            while(m--){
                scanf("%d%d",&t1,&t2);
                if(Find(t1)!=Find(t2)){
                    Union(t1,t2);
                }
            }
            for(i=1;i<=n;++i){
                if(parent[i]<0){
                    res++;
                }
            }
            printf("%d
",res);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/symons1992/p/3439917.html