uva 10608 Friends 并查集

/*



题目:

    n个人中有m对人互为朋友,若a认识b,b认识c,则a认识c,问这n个人中最多有多少人

    相互认识



分析:

    并查集实现,把互为朋友的放置在同一集合中,询问最大人数时可以使用计数器计算该

    人所在集合的父节点的数字



*/

#include <iostream>

#include <cstdio>

#include <cstring>



using namespace std;



const int X = 30002;



int p[X],cnt[X],n,m;



int find_set(int x)

{

    if(x!=p[x])

        p[x] = find_set(p[x]);

    return p[x];

}



int main()

{

    freopen("sum.in","r",stdin);

    freopen("sum.out","w",stdout);

    int t,x,y;

    cin>>t;

    while(t--)

    {

        memset(cnt,0,sizeof(cnt));

        scanf("%d%d",&n,&m);

        for(int i=1;i<=n;i++)

            p[i] = i;

        for(int i=1;i<=m;i++)

        {

            scanf("%d%d",&x,&y);

            x = find_set(x);

            y = find_set(y);

            if(x!=y)

                p[y] = x;

        }

        for(int i=1;i<=n;i++)

        {

            x = find_set(i);

            cnt[x]++;

        }

        int ans = 0;

        for(int i=1;i<=n;i++)

            ans = max(cnt[i],ans);

        cout<<ans<<endl;

    }

    return 0;

}

 

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