poj 1655 Balancing Act (树形dfs)

http://poj.org/problem?id=1655

poj3107,只要求输出一个数值最小的点。

刚开始的答案值修改的num[]记录的,罪过罪过。。。 

code:

#include<cstdio>
#include<cstring>
#define Max(a, b)   a>b?a:b
using namespace std ;
const int MAX = 20001 ;
int k, n, Min, anspoint, ansnum ;
int vis[MAX], head[MAX], num[MAX] ;
struct Edge{
    int v, next ;
}edge[2*MAX] ;
void addedge(int a, int b){
    edge[k].v = b ;
    edge[k].next = head[a] ;
    head[a] = k ++ ;
}
void dfs(int x){
    int i, v, min = -1 ;
    num[x] = 1 ;
    vis[x] = 1 ;
    for(i=head[x]; i; i=edge[i].next){
        v = edge[i].v ;
        if(vis[v]) continue ;
        dfs(v) ;
        num[x] += num[v] ;
        min = Max(min, num[v]) ;
    }
    min = Max(min, n-num[x]) ;
    if(min<Min){
        anspoint = x ;
        Min = min ;
        ansnum = min ;
    }else if(min==Min&&anspoint>x){
        anspoint = x ;
        ansnum = min ;
    }
}
int main(){
    int t, x, y ;
    scanf("%d", &t) ;
    while(t--){
        scanf("%d", &n) ;
        k = 1 ;
        memset(head, 0sizeof(head)) ;
        for(int i=1; i<n; i++){
            scanf("%d%d", &x, &y) ;
            addedge(x, y) ;
            addedge(y, x) ;
        }
        memset(vis, 0sizeof(vis)) ;
        memset(num, 0sizeof(num)) ;
        Min = MAX ;
        dfs(1) ;
        printf("%d %d\n", anspoint, ansnum) ;
    }
    return 0 ;
}

原文地址:https://www.cnblogs.com/xiaolongchase/p/2373486.html