hdu1325最大联通分量+树中点与边数值关系

树中的点永远是边数+1。然后判断图中最大联通分量是否大于一。并且们每个点都要访问到。不过目测这道题目深搜也可以过。

#include<iostream>

#include<set>

#include<cstdio>

#include<vector>

using namespace std;

const int MAXN=10000005;

const int MAXM=100005;



int u[MAXN];

int sum[MAXN];

set<int>num;

//bool seted[MAXN];

int find(int p)

{

    if(u[p]==p)

    {

       // seted[p]=1;

        return p;

    }else

    {

       // seted[p]=1;

        return u[p]=find(u[p]);

    }

}

void connect(int a,int b)

{

    int f1=find(a);

    int f2=find(b);

    if(f1<f2)

    {

        u[f2]=f1;

    }else

    {

        u[f1]=f2;

    }

}

int main()

{

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        int max=1;

        int i=0;

        num.clear();

        vector<int>input[2];

        input[0].clear();

        input[1].clear();

        //memset(seted,0,sizeof(seted));

        for(i=0;i<=n-1;i++)

        {

            int num1,num2;

            scanf("%d%d",&num1,&num2);

            

            num.insert(num1);

            num.insert(num2);

            input[0].push_back(num1);

            input[1].push_back(num2);

        }

        set<int>::reverse_iterator cp=num.rbegin();

        for(cp=num.rbegin();cp!=num.rend();cp++)

        {

            u[*cp]=*cp;

            sum[*cp]=0;

        }

        //memset(sum,0,sizeof(sum));

        for(i=0;i<=n-1;i++)

        {

            connect(input[0][i],input[1][i]);

        }

        for(cp=num.rbegin();cp!=num.rend();cp++)

        {

            sum[find(*cp)]++;

        }

        for(cp=num.rbegin();cp!=num.rend();cp++)

        {

            if(sum[*cp]>max)

            {

                max=sum[*cp];

            }

        }

        printf("%d\n",max);

    }

    return 0;

}

  

你可能感兴趣的:(HDU)