HDU 1856

并查集水题,一开始超时了,把cin换成scanf就AC了
#include <iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
int pre[10000005];
int m[10000000];
int Find(int x)
{
    int p,t;
    p=x;
    while(x!=pre[x])
        x=pre[x];
    while(p!=x)
    {
        t=pre[p];
        pre[p]=x;
        p=t;
    }
    return x;
}
void join(int a,int b)
{
    int p=Find(a);
    int q=Find(b);
    if(p!=q)
    {
        pre[p]=q;
        m[q]+=m[p];
    }
}

int main()
{
    int t;

    while(cin>>t)
    {
        if(t==0)
        {
            cout<<"1"<<endl;
            continue;
        }
        for(int i=1; i<=10000000; i++)
        {
            pre[i]=i;
            m[i]=1;
        }
        int a,b;
        int ma=-1;
        while(t--)
        {

            scanf("%d %d",&a,&b);
            join(a,b);
            ma=max(ma,m[Find(b)]);
        }

        cout<<ma<<endl;
    }
    return 0;
}

posted @ 2018-04-28 00:41  MCQ  阅读(82)  评论(0编辑  收藏  举报