POJ 1655 Balancing Act
2014-03-12 15:28
197 查看
树形dp,水。 平衡值是去掉当前节点后剩下的树中节点数最大的树的节点数,求最小平衡值。多个答案任意输出一组。把2378的代码稍微改改就行了。。。
ps:双向存边时,边数应至少为节点的两倍,否则会RE.
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; }
相关文章推荐
- POJ 1655 Balancing Act (树的重心 + DFS)
- poj 1655 Balancing Act
- 【POJ】1655 Balancing Act 树的重心
- POJ1655 Balancing Act——树的重心,Dfs
- POJ 1655 Balancing Act( 树的重心 )
- poj 1655 Balancing Act(求树的重心)
- POJ 1655 Balancing Act
- 树的重心学习小记 Poj 1655 Balancing Act
- POJ 1655 Balancing Act 树形DP入门题
- POJ 1655 - Balancing Act 树型DP
- poj 1655 Balancing Act 求树的重心(详解树重心求法)
- POJ 1655 Balancing Act 树的重心
- POJ 1655 Balancing Act(求树的重心--树形DP)
- (POJ 1655 Balancing Act)树型DP + 删点
- Balancing Act - POJ 1655 树形dp
- POJ 1655 Balancing Act(求树的重心)
- poj 1655 Balancing Act 【树的重心】
- POJ-1655-Balancing Act
- poj 1655 Balancing Act(树的重心,树形dp)
- POJ 1655 Balancing Act (树的重心)