POJ 1655 Balancing Act(简单树状DP)
来源:互联网 发布:淘宝刷好评兼职怎么找 编辑:程序博客网 时间:2024/06/14 00:27
题目大意:
给出N个点,N-1条边,删除一个点后分成至少两棵子树,子树中点最多的那棵就称说它Balance
输出:Balance最小的点,和删除该点后的Balance值
思路:
树形DP
用presum来记录该点前的总点数目
然后用sum来记录包括目前点的总的点数
那么连在同一点的其他子树的点数目就为n-sum-1
然后可得dp[u]={presum,n-sum-1};
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>using namespace std;#define min(a,b) a<b?a:b#define max(a,b) a>b?a:b#define N 20020#define INF 0x7FFFFFFvector<int>g[N];int n;int dp[N];int dfs(int u,int pre){int i,sum,t,as;sum = 0;//总点数as = 0;for(i=0;i<g[u].size();i++){int v=g[u][i];if(v==pre)continue;t = dfs(v,u);sum += t;as = max(as,t);}dp[u]=max(n-sum-1,as);return sum+1;}int main(){int T;int i,j,u,v,node,len;scanf("%d",&T);while(T--){scanf("%d",&n);for(i=0;i<=n;i++)g[i].clear();for(i=1;i<n;i++){scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}dfs(1,-1);len=dp[1],node=1;for(i=2;i<=n;i++){if(dp[i] < len){len = dp[i];node = i;}}printf("%d %d\n",node,len);}return 0;}
- POJ 1655 Balancing Act(简单树状DP)
- poj 1655 Balancing Act 树状dp
- POJ--1655--Balancing Act--简单树形DP
- 简单树形dp-poj-1655-Balancing Act
- (简单) 树形dp POJ 1655 Balancing Act
- poj 1655 Balancing Act 树状DP,求树的质心
- POJ 1655 Balancing Act(简单树型dp)
- POJ1655 Balancing Act(树状DP)
- poj1655 Balancing Act 树状dp
- POJ 1655 Balancing Act 树形dp
- POJ 1655 - Balancing Act 树形DP
- poj 1655 Balancing Act(树形dp)
- poj 1655 Balancing Act(树形DP)
- poj 1655 Balancing Act(树dp)
- poj 1655 Balancing Act(树dp)
- Balancing Act - POJ 1655 树形dp
- POJ 1655 Balancing Act(树型DP)
- poj 1655 Balancing Act (树形dp)
- CCreateContext
- RadCartesianChart图表控件对象名称的获取方法
- 浅谈 Oracle 监听器
- 第17章,进程间通信之剪贴板
- wince中创建高优先级高实时性的线程
- POJ 1655 Balancing Act(简单树状DP)
- poj 1743求最长不重叠公共子串
- Direct3D应用中的2D应用
- 图像库 智能识别库 机器学习
- 正则表达式练习,持续更新中
- 线程同步锁
- Oracle 字符串加密方法
- 基于Android开发游戏,在百度手机应用里面上线
- Richard Stevens的几本书