//poj1655树状dp
//求一个数的重心
// dfs找到节点v的各个子树的节点数
// 取最大值设为num[v],而v节点以上的子树的节点数
// 为总数-num[v]-1(包括v节点本身)设为t
// dp[v] = max (num[v],t);
// 则最终的结果为min(dp[i])对应的i和dp[i];
// 对于dp渣渣的我,真的不简单,哎,继续练喽
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 20080;
struct Edge{int v;int next;
}edges[maxn<<1];
bool vis[maxn];
int adj[maxn];
int dp[maxn];
int nu[maxn];
int n;
int num;
void addEdge(int u,int v){edges[num].v = v;edges[num].next = adj[u];adj[u] = num++;edges[num].v = u;edges[num].next = adj[v];adj[v] = num++;
}void init(){scanf("%d",&n);num=0;memset(adj,-1,sizeof(adj));memset(dp,0,sizeof(dp));memset(vis,0,sizeof(vis));memset(nu,0,sizeof(nu));for (int i=0;i<n-1;i++){int a,b;scanf("%d%d",&a,&b);addEdge(a,b);}
}int dfs(int u){int sum=0,ans=0;vis[u] = true;for (int i=adj[u];i!=-1;i = edges[i].next){int v = edges[i].v;if (!vis[v]){int t = dfs(v);sum +=t;ans = max (ans,t);}}nu[u] = sum+1;int t = n-nu[u];dp[u]=max(t,ans);return nu[u];}void solve(int &ans,int &index){dfs(1);for (int i=1;i<=n;i++)if (ans>dp[i]){ans=dp[i];index=i;}printf("%d %d\n",index,ans);
}// void print(int &ans){// }int main(){int t;freopen("G:\\Code\\1.txt","r",stdin);scanf("%d",&t);while(t--){//printf("111\n");int ans=0x7f7f7f7f;int index=0;init();solve(ans,index);//print(ans);}
}

poj 1655 Balancing Act 树状dp相关推荐

  1. POJ 1655 Balancing Act[树的重心/树形dp]

    Balancing Act 时限:1000ms Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered ...

  2. POJ 1655 Balancing Act (树的重心)

    题目链接:http://poj.org/problem?id=1655 题意: 求树的重心(最小序号),以及去掉重心后子树节点最大是多少.(树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最 ...

  3. POJ - 1655 Balancing Act(树的重心)

    题目链接:点击查看 题目大意:给一个树,删除其中一个点就会形成一个森林,点的平衡度为删除了这个节点后,所形成多个树,其中组成树的节点最多,节点个数就是那个平衡度. 题目分析:求树的重心,模板题: 树的 ...

  4. POJ 1655 Balancing Act (树的重心 + DFS)

    传送门:POJ 1655 题目大意: 求树的重心,如果有多个重心则输出根节点编号最小的一个.树的重心也叫树的质心.找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后 ...

  5. POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)

    <题目链接> 题目大意: 给你一棵树,任意去除某一个点后,树被分成了几个联通块,则该点的平衡值为所有分成的连通块中,点数最大的那个,问你:该树所有点中,平衡值最小的那个点是什么? 解题分析 ...

  6. poj 1655 Balancing Act(求树的重心)

    在一棵树中,去掉一个点,使得剩下的每一颗树的结点数最多的那颗树,结点数最少. 具体解法看注释. /*定义dp[i]为去掉i结点,剩下的树里,结点最多的那颗树的结点数.可分为2类情况.1.由于i结点的儿 ...

  7. POJ 1655 Balancing Act

    只要一次无根树转有根树就可以计算了,一开始每个点都转,发现那就不是动态规划,是枚举了.... #include<iostream> #include<cstdio> #incl ...

  8. hdu 1561 The more, The Better_树状dp

    题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...

  9. UVA10859 放置街灯 Placing Lampposts(树状DP)

    UVA10859 放置街灯 Placing Lampposts(树状DP) 这道题有两种解决方法,因为原图保证无重边无环无自环, 所以原图一定是一颗树(或森林).,都是树状DP,但是实现的过程大同小异 ...

最新文章

  1. HTML5培训好不好
  2. BOOST_PREDEF_WORKAROUND宏相关的测试程序
  3. Nginx 介绍配置
  4. 【STM32】修改芯片型号后报 Error 的解决方案
  5. A - 数据结构实验之栈与队列一:进制转换
  6. 微信背后的男人——张小龙
  7. 2021年最好用&完全免费的图片压缩网站、软件推荐(包括GIF)
  8. 视觉分类任务中,Confusion Matrix (混淆矩阵) 的绘制
  9. VDI(Virtual Desktop Infrastructure)
  10. 安装配置MacTex
  11. (4.3)进程管理之线程
  12. 85款中国风字体!超级好看的古风系列
  13. java基础--Java入门
  14. I/O流(Input、Output)
  15. XCPC2020赛季流水账
  16. 浅谈码农职场修养三五点
  17. php网页采集 修改版
  18. 给服务器添加硬盘,Ubuntu挂载硬盘
  19. 理解——先序遍历是入栈过程,中序遍历是出栈过程
  20. 怎么做加减计算机程序vb,如何用VB设计一个简单计算器能进行加减乘除运算?...

热门文章

  1. 微博html5版打不开,PC端网页版微博就是打不开是什么问题啊!缓 – 手机爱问
  2. 【RMQ】POJ 3264 Balanced Lineup
  3. 夜神模拟器连接手柄无反应_夜神安卓模拟器连接手柄的具体操作方法介绍
  4. ApacheCon Asia 2022 启动,7 场阿里云大数据 +AI 议题分享等你围观
  5. 血泪总结:如何从微信小程序的坑跳进支付宝小程序的大坑
  6. 2022年6月大学英语六级翻译
  7. 如何通过安装包安装应用到手机
  8. 如何打开倾斜摄影数据osgb
  9. html5适应手机比例,HTML5 如何让手机网站自适应设备屏幕宽度
  10. Cesium中使用Sampler3D,3D纹理,实现体渲染