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;
}
原文地址:https://www.cnblogs.com/yejinru/p/2549900.html