UVA 10608 Friends(并查集)

题意:A与B是朋友,B与C是朋友,那么A与C也是朋友,问一个朋友圈中最多有多少人。

思路:并查集
Find函数找自己归属队伍
Union函数将x和y合并为一个队伍
最好在通过遍历每个人,找出最大的朋友圈(队伍)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#define INF 0x7fffffff

using namespace std;
int fa[30005],b[30005];

int Find(int x)
{
    if(x!=fa[x])
        fa[x]=Find(fa[x]);
    return fa[x];
}
void Union(int x,int y)
{
    int a=Find(x);
    int b=Find(y);
    if(a!=b)
        fa[a]=b;
}
int main()
{
    int T,n,m,x,y,z;
    scanf("%d",&T);
    while(T--)
    {
        memset(fa,0,sizeof(fa));
        memset(b,0,sizeof(b));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            fa[i]=i;
        while(m--)
        {
            scanf("%d%d",&x,&y);
            Union(x,y);
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            z=Find(i);
            ans=max(ans,++b[z]);
        }
        printf("%d\n",ans);
    }
    return 0;
}
发布了19 篇原创文章 · 获赞 0 · 访问量 192

猜你喜欢

转载自blog.csdn.net/qq_43032263/article/details/104414956