问题描述
有一个镇有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; }