poj 1655 树形DP

来源:互联网 发布:python 技术指标 编辑:程序博客网 时间:2024/04/30 14:19

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define MAX 0x3f3f3f3fstruct Edge{    int to, next;};int maxsonsize[22000], size[22000];int head[22000], tot;Edge edge[44000];int N;bool mark[22000];int ans[22000];int add_edge( int a, int b ){    edge[tot].to = b;    edge[tot].next = head[a];    head[a] = tot++;    edge[tot].to = a;    edge[tot].next = head[b];    head[b] = tot++;    return 0;}int DFS( int pos ){    mark[pos] = true;    maxsonsize[pos] = 0;    size[pos] = 1;    for( int i = head[pos]; i != -1; i = edge[i].next ){        int to = edge[i].to;        if( !mark[to] ){            DFS( to );            maxsonsize[pos] = max( maxsonsize[pos], size[to] );            size[pos] += size[to];        }    }    return 0;}int main(){    int T;    cin >> T;    while( T-- ){        cin >> N;        tot = 0;        memset( head, -1, sizeof( head ) );        for( int i = 1; i < N; i++ ){            int temp1, temp2;            cin >> temp1 >> temp2;            add_edge( temp1, temp2 );        }        memset( mark, false, sizeof( mark ) );        DFS( 1 );        int anspos = 0;        ans[0] = MAX;        for( int i = 1; i <= N; i++ ){            ans[i] = max( maxsonsize[i], N - size[i] );            if( ans[i] < ans[anspos] ){                anspos = i;            }        }        cout << anspos << " " << ans[anspos] << endl;    }    return 0;}


0 0