题目大意:
在一群人里挑选一些人,这些必须都是朋友关系,关系可以是直接的也可以是间接的。
解题思路:
非常简单明了的一道并查集,但是不是求一共有几个集合,而是求每个集合中的元素个数,进而求出最大值,只需要在合并两个集合时处理一下,让这两个集合的元素个数也合并一下就行了。接下来只需要找出最大值即可。要注意的一个地方就是:当n=0时,要输出1。
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long
#define db double
#define maxn 10000000
#define max(a,b) ((a>b)?(a):(b))
#define min(a,b) ((a<b)?(a):(b))
int f[maxn],num[maxn];
void frst(){
for (int i=0;i<=maxn;i++){
f[i]=i;
num[i]=1;
}
}
int get(int x){
if (f[x]!=x) f[x]=get(f[x]);
return f[x];
}
void merge(int a,int b){
int p=get(a); int q=get(b);
if (p!=q) {
f[p]=q;
num[q]+=num[p];
}
}
int main(){
int n,a,b,i,sum,maxx;
while(~scanf("%d",&n)){
if (n==0) {
printf("1\n");
continue;
}
maxx=0;
frst();
for (int i=1;i<=n;i++){
scanf("%d%d",&a,&b);
if (a>maxx) maxx=a;
if (b>maxx) maxx=b;
merge(a,b);
}
int Max=0;
for (int i=1;i<=maxx;i++)
if (num[i]>Max) Max=num[i];
printf("%d\n",Max);
}
return 0;
}