hdu 1856
题意:求各个连通块中人数最大的那个并输出。
题解:在join函数里加一个num数组存各个联通块的人数,并找出最大的那个。(要压缩路径)
代码:
#include <cstdio>
using namespace std;
int pre[210000],num[210000],max;
int find(int x){
int r = x;
while(pre[r] != r){
r = pre[r];
}
int i = x, j;
while(i != r){
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy) num[fx]+=num[fy];
if(num[fx]>max) max=num[fx];
pre[fy]=fx;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if (n == 0)
{
printf("1\n");
continue;
}
max = 0;
int a,b;
for(int i = 1; i <= 210000; i++)
{
pre[i] = i;
num[i] = 1;
}
for(int i=0;i<n;i++){
scanf("%d%d",&a,&b);
join(a,b);
}
printf("%d\n",max);
}
return 0;
}

浙公网安备 33010602011771号