您的位置:首页 > 其它

POJ 1655 Balancing Act

2014-03-12 15:28 197 查看
树形dp,水。 平衡值是去掉当前节点后剩下的树中节点数最大的树的节点数,求最小平衡值。多个答案任意输出一组。把2378的代码稍微改改就行了。。。

ps:双向存边时,边数应至少为节点的两倍,否则会RE.

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define INF 1000000007
#define N 200005
int n;
struct Node{
int v;
Node *next;
}e
, *head
;
int mv
, sum
;
int ptr = 0;
void init(){
ptr = 0;
for(int i = 0; i <= n; i++){
head[i] = NULL;
mv[i] = 0;
sum[i] = 0;
}
}
void adde(int x, int y){
e[ptr].v = x;
e[ptr].next = head[y];
head[y] = &e[ptr ++];
e[ptr].v = y;
e[ptr].next = head[x];
head[x] = &e[ptr ++];
}
int tdp(int x, int par){
Node *p = head[x];
while(p){
if(p -> v != par){
int vv = tdp(p -> v, x);
sum[x] += vv;
if(vv > mv[x])mv[x] = vv;
}
p = p -> next;
}
return sum[x] + 1;
}
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
int x, y;
init();
for(int i = 1; i < n; i++){
scanf("%d%d", &x, &y);
adde(x, y);
}
tdp(1, 0);
int maxv = INF;
int id = 0;
for(int i = 1; i <= n; i++){
int xx = max((n - sum[i] - 1), mv[i]);
if(maxv > xx){
maxv = xx;
id = i;
}
}
printf("%d %d\n", id, maxv);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: