1. 程式人生 > >HDU1856(並查集求最大集合)

HDU1856(並查集求最大集合)

有比較說明一點經驗:求最大值有時候不需要把資料求出來後遍歷。

注意:最大值的求解和比較的順序沒有關係,所以可以一邊求出資料,一邊進行比較。【即用設定全域性變數maxp的方法解決】

省去最後遍歷的步驟。 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e7+5;
int pre[maxn];
int re[maxn];
int n;
int a,b;
int foot1,foot2,maxp;
void init()
{
    for(int i=0; i<maxn; ++i)
    {
        pre[i]=i;
        re[i]=1;
    }
    maxp=1;
}
int finds(int x)
{
    if(x==pre[x])
        return x;
    pre[x]=finds(pre[x]);
    return pre[x];
}
void unions(int x,int y)
{
    foot1=finds(x);
    foot2=finds(y);
    if(foot1!=foot2)
    {
        pre[foot2]=foot1;
        re[foot1]+=re[foot2];
        maxp=max(re[foot1],maxp);
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        init();
        for(int i=0; i<n; ++i)
        {
            scanf("%d%d",&a,&b);
            unions(a,b);
        }
        printf("%d\n",maxp);
    }
    return 0;
}