poj 1655

来源:互联网 发布:知源药业有限公司 编辑:程序博客网 时间:2024/06/08 08:33
 

和刚才那个一样的题.. 改一下就过了

#include <iostream>
#include <stdio.h>
#include <vector>
#include <cstring>

using namespace std;

const int MAXN = 50005;
int node [MAXN];
int ans[MAXN];
int head[MAXN];
int sum, n;
int edge[MAXN*2];
int next[MAXN*2];
int vis[MAXN];

void addedge ( int a , int b )
{
    int temp = head[a];
    head[a] = sum;
    edge[sum] = b;
    next[sum] = temp;
    sum ++;

    temp = head[b];
    head[b] = sum;
    edge[sum] = a;
    next[sum] = temp;
    sum ++;
}

int dfs ( int u )
{
    int num = 1;
    vis[u] = 1;
    for ( int i = head[u] ; i != -1; i = next[i] )
    {
        int v = edge[i];
        //cout << "***** " << v << endl;
        if ( !vis[v] )
        {
            num += dfs( v );
        }
    }
    return node[u] = num;
}

void find_ans ( int u )
{
    ans[u] = n - node[u];
    vis[u] = 1;
    for ( int i = head[u] ; i != -1 ; i = next[i] )
    {
        int v = edge[i];
        if ( !vis[v] )
        {
            ans[u] = max ( node[v] , ans[u] );
            find_ans ( v );
        }
    }
}

int main()
{
    int T;
    scanf("%d" ,&T);
    while (  T-- )
    {
        scanf("%d" , &n ) ;
        sum =0;
        memset ( ans , 0 , (n+1)*sizeof ( int ));
        memset ( node , 0 , (n+1)*sizeof ( int ));
        memset ( vis , 0 , (n+1)*sizeof ( int ));
        memset ( head , -1 , (n+1)*sizeof ( int ));
        for ( int i = 0 ; i < n-1; i ++ )
        {
            int a , b;
            scanf("%d%d", &a , &b );
            addedge( a , b );
        }
        //cout << "here" << endl;
        dfs ( 1 );
        //cout << "here" << endl;
        memset ( vis , 0 , (n+1)*sizeof ( int ));
        find_ans ( 1 );
        //cout << "here" << endl;
        int w = 99999999;
        for ( int i = 1 ; i <= n ; i ++ )
        {
            if ( w > ans[i] )
                w = ans[i];
        }
        int flag = 1;
        for ( int i = 1; i <= n ; i ++ )
            if ( w == ans[i] && flag )
            {
                printf("%d %d", i,w );
                break;
            }


        printf("\n");
    }
    return 0;
}

原创粉丝点击