朋友 并查集

问题描述

有一个镇有N个居民。当然其中有许多人是朋友的关系。根据有名的谚语:“我朋友的朋友也是我的朋友”,所以如果A和B是朋友,B和C是朋友,那么A和C也是朋友。 你的任务是算出在这个镇中最大的朋友集团为多少人。

输入格式

输入文件的第一行有2个正整数 N 和 M 。N代表镇上居民的数目(1 <= N <= 30000 ),M 代表这些居民中朋友关系的数目( 0 <= M <= 30000)。接下来的M行每行有2个整数A,B( 1 <= A,B <= N , A不等于B),代表A,B为朋友关系。这M行中可能有的会重复出现。

输出格式

输出文件仅一行,在这个镇中最大的朋友集团为多少人。

输入样例

10 12
1 2
3 1
3 4
5 4
3 5
4 6
5 2
2 1
7 10
1 2
9 10
8 9

输出样例

6

限制和约定

时间限制:1s

空间限制:128MB

#include<iostream>
using namespace std;
int f[50010],n,m,p,size[30010],ans[30010];
int find(int x)
{
    if(x==f[x]) return x;
    else return f[x]=find(f[x]);
}
void merge(int x,int y)
{
    int rx=find(x),ry=find(y);
    if(rx!=ry){
        if(size[rx]>=size[ry]){f[ry]=rx;size[rx]+=size[ry];}
        else {f[rx]=ry;size[ry]+=size[rx];}
    } 
}
int main()
{
    int a,b,ds=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++){f[i]=i;size[i]=1;}
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b;
        merge(a,b);
    }
    for(int i=1;i<=n;i++)
    {
        ans[find(i)]++;
        if(ans[find(i)]>ds) ds=ans[find(i)];
        
    }
    cout<<ds;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/hfang/p/11239992.html