这两道题非常相似,都是计算一个联通中所有节点的个数,只需要在find中加个计算就可以了
#include<stdio.h>
int parent[10000005];
int num[10000005];
int find(int x){
if(x != parent[x])
parent[x] = find(parent[x]);
return parent[x];
}
void Merge(int a,int b){
int c = find(a);
int d = find(b);
if(c != d){
parent[c] = d;
num[d] += num[c];
}
}
int main(){
int n,count,max1 = 0;
int A,B;
while(~scanf("%d",&n)){
if(n == 0)
printf("1\n");
else
{
for(int i = 1 ; i <= 10000005 ; i++){
parent[i] = i;
num[i] = 1;
}
for(int i = 1 ; i <= n ; i++){
scanf("%d %d",&A,&B);
Merge(A,B);
if(A > max1)
max1 = A;
if(B > max1)
max1 = B;
}
//printf("%d\n",max1);
int max = 0;
for(int i = 1 ; i <= max1 ; i++){
if(num[i] > max){
max = num[i];
}
}
printf("%d\n",max);
}
}
return 0;
}