您的位置:首页 > 其它

POJ 1655 Balancing Act 树形DP入门题

2013-08-29 10:35 267 查看



View Code

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int maxn = 20003;

struct node
{
int v, next, w;
}edge[maxn<<1];

int tot;
int head[maxn];
int n;

void init()
{
tot = 0;
memset(head, -1, sizeof(int) * (n+1));
}

void add(int x, int y)
{
edge[tot].v = y;
edge[tot].next = head[x];
head[x] = tot++;
}

int maxz(int a, int b)
{
return a > b ? a : b;
}

int minz(int a, int b)
{
return a < b ? a : b;
}

int ans, kk;
int num[maxn];

void dfs(int u, int p)
{
int i, tmp = 0;
num[u] = 0;
for(i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(v == p) continue;
dfs(v, u);
tmp = maxz(tmp, num[v] + 1);
num[u] += num[v] + 1;
}
tmp = maxz(tmp, n - num[u] - 1);
if(ans > tmp)
{
ans = tmp;
kk = u;
}
}

int main()
{
int i, j, cas;
int x, y;
scanf("%d", &cas);
while(cas--)
{
scanf("%d", &n);
init();
for(i = 1; i < n; i++)
{
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
ans = 1<<29;
dfs(1, -1);
printf("%d %d\n", kk, ans);
}
return 0;
}
/*
8
7
2 6
1 2
1 4
4 5
3 7
3 1
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: