题意:给你一棵树,让你求一点,使该点到其余各点的距离之和最小。如果这样的点有多个,则按升序依次输出。

树型dp

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <set>
  5. using namespace std;
  6. const int maxn=50010;
  7. typedef __int64 LL;
  8. vector<int>tree[maxn];// to save the relation
  9. LL f[maxn],g[maxn],dp[maxn];//f[u] u as root to all his sons' distance g[u]the number of u'sons
  10. set<int> myqueue;
  11. void dfs(int u,int pa){
  12. /* 以1为根,所有的子树到他们的子节点的和 */
  13. if(tree[u].size() == 1 && u != 1){
  14. g[u]=1;
  15. f[u]=0;
  16. return;
  17. }
  18. for(int v=0;v < tree[u].size();v++){
  19. if(tree[u][v]!=pa){
  20. dfs(tree[u][v],u);
  21. g[u]+=g[tree[u][v]];//the son's sons' number
  22. f[u]+=f[tree[u][v]]+g[tree[u][v]];
  23. }
  24. }
  25. g[u]++;// himself
  26. }
  27. void dfs2(int u,int pa){// to sum the way from his father
  28. //再考虑从父节点来的
  29. if(tree[u].size()==1 && u!=1){
  30. dp[u]=dp[pa]+g[1]-(g[u]<<1);
  31. return;
  32. }
  33. for(int v=0;v<tree[u].size();v++){
  34. if(tree[u][v]!= pa){
  35. //到某节点的距离的和=该节点子树的距离和(在dfs1中获得)+从父亲那一支子树获得的和(此时,父节点那一支看成子树)。dp[儿子]=dp[父节点]-dp[儿子]-g[儿子](儿子到父节点这条路被减了子树的子节点数的次数) + dp[儿子]+(g[1]-g[儿子])(父树上的所有节点)
  36. dp[tree[u][v]]=dp[u]+g[1]-(g[tree[u][v]]<<1);
  37. dfs2(tree[u][v],u);//先算了之后再跑子树
  38. }
  39. }
  40. }
  41. int main(){
  42. int t;
  43. int n,I,R,a,b;
  44. scanf("%d",&t);
  45. LL mmin;
  46. while(t--){
  47. scanf("%d%d%d",&n,&I,&R);
  48.  
  49. for(int i=0;i<=n;i++){
  50. tree[i].clear();
  51. }
  52. for(int i=2;i<=n;i++){
  53. scanf("%d%d",&a,&b);
  54. tree[a].push_back(b);
  55. tree[b].push_back(a);
  56. }
  57. // for(int i=0;i<=n;i++){
  58. // for(int j=0;j<tree[i].size();j++){
  59. // printf("%d ",tree[i][j]);
  60. // }
  61. // printf("\n");
  62. // }
  63. memset(f,0,sizeof(f));
  64. memset(g,0,sizeof(g));
  65. dfs(1,-1);
  66. dp[1]=f[1];
  67. dfs2(1,-1);
  68. mmin=dp[1];
  69. myqueue.clear();
  70. myqueue.insert(1);
  71. for(int i=2;i<=n;i++){
  72. if(dp[i]<mmin){
  73. mmin=dp[i];
  74. myqueue.clear();
  75. myqueue.insert(i);
  76. }
  77. if(dp[i]==mmin) myqueue.insert(i);
  78. }
  79. //warning : output long long should be I64d
  80. printf("%I64d\n",I*I*R*mmin);//use set not num but the op
  81. for(set<int>::iterator it=myqueue.begin();it!=myqueue.end();++it){
  82. printf("%d ",*it);
  83. }
  84. printf("\n\n");
  85. }
  86. }

  

Power Station POJ 4045的更多相关文章

  1. Power Network (poj 1459 网络流)

    Language: Default Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 23407   ...

  2. Power Network - poj 1459 (最大流 Edmonds-Karp算法)

      Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24788   Accepted: 12922 Description A ...

  3. Building a Space Station POJ - 2031

    Building a Space Station POJ - 2031 You are a member of the space station engineering team, and are ...

  4. Power Strings POJ - 2406

    Power Strings POJ - 2406 时限: 3000MS   内存: 65536KB   64位IO格式: %I64d & %I64u 提交 状态 已开启划词翻译 问题描述 Gi ...

  5. poj - 4045 - Power Station

    题意:一棵有n个结点的树,要取其中的一个结点,使得该结点到其他所有结点的距离和dis最小,即损耗I * I * R * dis最小,输出最小损耗和该结点(有多个的话按结点编号从小到大输出)(3 < ...

  6. ( KMP 求循环节的个数)Power Strings -- poj -- 2406

    链接: http://poj.org/problem?id=2406 Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bi ...

  7. (最小生成树) Building a Space Station -- POJ -- 2031

    链接: http://poj.org/problem?id=2031 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6011 ...

  8. Building a Space Station POJ 2031 【最小生成树 prim】

    http://poj.org/problem?id=2031 Description You are a member of the space station engineering team, a ...

  9. Power Strings (poj 2406 KMP)

    Language: Default Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33205   ...

随机推荐

  1. jquery文字左右滚动

    实现jquery文字左右滚动 <div class="fl">中奖名单:</div> <div class="scrollText" ...

  2. DEDECMS中,获取当前栏目名称

    获取当前栏目名称 {dede:field name='typeurl' function=”GetTypeName(@me)”/} 指的是当前栏目的URL地址 {dede:field name='ty ...

  3. 《编写高质量代码-Web前端开发修改之道》笔记--第一章 从网站重构说起

    本章内容: 糟糕的页面实现,头疼的维护工作 Web标准--结构.样式和行为的分离 前端的现状 打造高品质的前端代码,提高代码的可维护性--精简.重用.有序 糟糕的页面实现,头疼的维护工作 工作中最大的 ...

  4. javascript常用对象

    A,window对象 window对象是浏览器模型对象的顶层对象 常用属性: screen:客户端的屏幕和显示性能的信息. history:客户端访问过的url信息 location:当前url链接的 ...

  5. 一段画对角线的canvas代码,之前没有写过canvas代码,现在记录下来

    <canvas id="other" style="width:320px;height:320px;"></canvas> var o ...

  6. 利用WeX5集成百度地图

    最近做一个地图类的app经过几天的摸索,终于完成百度地图集成的界面先看效果:1.加载完成之后,页面加载制定位置的地图2.顶部能够输入地图的关键字,地图显示符合条件的下拉列表3.用户选择了相应的选项后, ...

  7. Js popup position which right under target item

    <div style="margin-left:600px;"> <div id="Span1" style="color:#eee ...

  8. mysql之创建外键报150错误的处理方法

    这几天由于在赶项目进度,也就没有及时记录下自己的学习情况 ,在完成项目的这段时间里,碰到了很多问题,在解决问题的过程中学习了不少技巧. 这里就主要介绍一下在mysql数据库中为表之间建立外键时报100 ...

  9. 购买 CDRTools 2 正式版

    联系方式: Email:396390927@qq.com QQ: 396390927    QQ群: 26326434  组件价格: ¥50元/用户,免费更新: 此物为数字商品,并经过测试完全可用,谢 ...

  10. Python在Windows下开发环境配置汇总

    最近比较关注学习Python方面的资料和课程,由于Python本身基本都是在Linux下开发,本人windows用习惯了初用Linux各种别扭啊. 下面将我在配置Windows环境下的禁言写出来,与大 ...