hdu1856More is better

题目大意:

N个人两两互为朋友,朋友的朋友也是朋友,找到一个最大的团体这个团体里面的人都互为朋友,然后输出。

解题思路:

这道题用的其实就是并查集的基本操作,输出一个最大的集合即可。

#include
#define N 10000005
int fa[N],num[N],ans;
void initi()
{
    int i;
    for(i=0;i<=N;i++)
    {
        fa[i]=i;
        num[i]=1;
    }
    ans=1;
}
int getFa(int x)
{
    int i,j;
    i=j=x;
    while(i!=fa[i])
        i=fa[i];
    while(x!=fa[x]){
        j=x;
        x=fa[x];
        fa[j]=i;
    }
    return i;
}
void add(int a,int b)
{
    int x,y;
    x=getFa(a);
    y=getFa(b);
    if(x!=y){
        ans=ans>(num[x]+num[y])?ans:(num[x]+num[y]);
        if(num[x]>num[y]){
            fa[y]=x;
            num[x]+=num[y];
        }else{
            fa[x]=y;
            num[y]+=num[x];
        }
    }
}
int main()
{
    int n,a,b;
    while(scanf("%d",&n)!=EOF)
    {
        initi();
        while(n--){
                scanf("%d%d",&a,&b);
                add(a,b);
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(并查集)