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;
}

posted @ 2017-08-21 14:42  LMissher  阅读(175)  评论(0)    收藏  举报