题目大意:

根据题目的图很好理解意思,就是记录每一个点的balance,例如 i 的balance就是把 i 从这棵树中除去后得到的森林中含有结点数最多

的子树中的节点个数,然后找到所有节点中对应的balance的最小值 , 并输出最小值对应的最小的标号

题目不要看花。。。前一个是找最大,后面找所有最大值中的最小,我就是看错一直wa,后来人家题解刚看完题目意思就反应过来 , 囧死了 - -

昨天貌似做过一道类似的题,任意找一点 , 比如 1 作为根进行dfs,第一次dfs记录所有点对应的子树中含有的节点的总个数

第二次dfs记录down[i] , 也就是i子树中 i 连接的所有子树中含有节点数最多的节点个数

其实down[i]就相当 i 出去后 , i 下方森林可得到的最大balance , 还需要求一个 i 上方的balance , 这个上方的值就是n-sum[i]

两者比较取最大就可以了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. const int N = ;
  6. int first[N] , k , sum[N] , down[N] , rec[N];
  7.  
  8. struct Edge{
  9. int y , next;
  10. }e[N<<];
  11.  
  12. void add_edge(int x , int y)
  13. {
  14. e[k].y = y , e[k].next = first[x];
  15. first[x] = k++;
  16. }
  17.  
  18. void dfs1(int u , int fa)
  19. {
  20. sum[u] = ;
  21. for(int i=first[u] ; i!=- ; i=e[i].next)
  22. {
  23. int v = e[i].y;
  24. if(v == fa) continue;
  25. dfs1(v , u);
  26. sum[u] += sum[v];
  27. }
  28. }
  29. void dfs2(int u , int fa)
  30. {
  31. for(int i=first[u] ; i!=- ; i=e[i].next)
  32. {
  33. int v = e[i].y;
  34. if(v == fa) continue;
  35. down[u] = max(sum[v]+ , down[u]);
  36. dfs2(v , u);
  37. }
  38. }
  39.  
  40. int main()
  41. {
  42. // freopen("a.in" , "r" , stdin);
  43. int T;
  44. scanf("%d" , &T);
  45. while(T--)
  46. {
  47. int n , a , b;
  48. scanf("%d" , &n);
  49. memset(first , - , sizeof(first));
  50. k = ;
  51. for(int i= ; i<n ; i++){
  52. scanf("%d%d" , &a , &b);
  53. add_edge(a , b);
  54. add_edge(b , a);
  55. }
  56. memset(down , , sizeof(down));
  57. dfs1( , -);
  58. dfs2( , -);
  59. int minn = down[]-;
  60. rec[] = down[]-;
  61. // cout<<"down: 1: "<<down[1]<<" "<<sum[1]<<endl;
  62. for(int i= ; i<=n ; i++){
  63. // cout<<"down: i: "<<i<<" "<<" "<<down[i]<<" "<<sum[i]<<endl;
  64. rec[i] = max(down[i]- , n-sum[i]);
  65. minn = min(minn , rec[i]);
  66. }
  67. int i;
  68. for(i= ; i<=n ; i++){
  69. if(rec[i] == minn) break;
  70. }
  71. printf("%d %d\n" , i , minn);
  72. }
  73. return ;
  74. }

POJ 3107

求解问题的思想是和上面的题目是基本相同的,除了输入输出方式需要改变,然后数组开大点就可以照抄上面代码了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. const int N = ;
  6. int first[N] , k , sum[N] , down[N] , rec[N];
  7.  
  8. struct Edge{
  9. int y , next;
  10. }e[N<<];
  11.  
  12. void add_edge(int x , int y)
  13. {
  14. e[k].y = y , e[k].next = first[x];
  15. first[x] = k++;
  16. }
  17.  
  18. void dfs1(int u , int fa)
  19. {
  20. sum[u] = ;
  21. for(int i=first[u] ; i!=- ; i=e[i].next)
  22. {
  23. int v = e[i].y;
  24. if(v == fa) continue;
  25. dfs1(v , u);
  26. sum[u] += sum[v];
  27. }
  28. }
  29. void dfs2(int u , int fa)
  30. {
  31. for(int i=first[u] ; i!=- ; i=e[i].next)
  32. {
  33. int v = e[i].y;
  34. if(v == fa) continue;
  35. down[u] = max(sum[v]+ , down[u]);
  36. dfs2(v , u);
  37. }
  38. }
  39.  
  40. int main()
  41. {
  42. // freopen("a.in" , "r" , stdin);
  43. int n , a , b;
  44. while(scanf("%d" , &n) == ){
  45. memset(first , - , sizeof(first));
  46. k = ;
  47. for(int i= ; i<n ; i++){
  48. scanf("%d%d" , &a , &b);
  49. add_edge(a , b);
  50. add_edge(b , a);
  51. }
  52. memset(down , , sizeof(down));
  53. dfs1( , -);
  54. dfs2( , -);
  55. int minn = down[]-;
  56. rec[] = down[]-;
  57. // cout<<"down: 1: "<<down[1]<<" "<<sum[1]<<endl;
  58. for(int i= ; i<=n ; i++){
  59. // cout<<"down: i: "<<i<<" "<<" "<<down[i]<<" "<<sum[i]<<endl;
  60. rec[i] = max(down[i]- , n-sum[i]);
  61. minn = min(minn , rec[i]);
  62. }
  63. int num = ;
  64. for(int i= ; i<=n ; i++){
  65. if(rec[i] == minn){
  66. if(num == ) printf("%d" , i);
  67. else printf(" %d" , i);
  68. num++;
  69. }
  70. }
  71. }
  72. return ;
  73. }

POJ 1655 Balancing Act && POJ 3107 Godfather的更多相关文章

  1. POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)

    关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...

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

    树的重心的定义是: 一个点的所有子树中节点数最大的子树节点数最小. 这句话可能说起来比较绕,但是其实想想他的字面意思也就是找到最平衡的那个点. POJ 1655 题目大意: 直接给你一棵树,让你求树的 ...

  3. poj 1655 Balancing Act 求树的重心【树形dp】

    poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...

  4. poj 1655 Balancing Act(找树的重心)

    Balancing Act POJ - 1655 题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的. /* 找树的重心可以用树形dp或 ...

  5. POJ 1655 Balancing Act【树的重心】

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14251   Accepted: 6027 De ...

  6. POJ 1655.Balancing Act 树形dp 树的重心

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14550   Accepted: 6173 De ...

  7. POJ 1655 - Balancing Act 树型DP

    这题和POJ 3107 - Godfather异曲同工...http://blog.csdn.net/kk303/article/details/9387251 Program: #include&l ...

  8. POJ 1655 Balancing Act 树的重心

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

  9. POJ 1655 - Balancing Act - [DFS][树的重心]

    链接:http://poj.org/problem?id=1655 Time Limit: 1000MS Memory Limit: 65536K Description Consider a tre ...

随机推荐

  1. (DP)51NOD 1049 最大子段和

    N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值.当所给的整数均为负数时和为0.   例如:-2,11,-4,13,-5 ...

  2. 【React Native】React Native项目设计与知识点分享

    闲暇之余,写了一个React Native的demo,可以作为大家的入门学习参考. GitHub:https://github.com/xujianfu/ElmApp.git GitHub:https ...

  3. C语言小项目-基于TCP协议和SOCKET编程的网络通信系统

    1.1 功能结构图   网络通信系统一共由4个模块组成,分别是点对点客户端.点对点服务端.服务器中转服务端.服务器中转客户端.这4个模块是成对使用的,点对点客户端和点对点服务端一起使用,服务器中转服务 ...

  4. C#中接受一个非字符串的输入

    接受来自用户的值 System 命名空间中的 Console 类提供了一个函数 ReadLine(),用于接收来自用户的输入,并把它存储到一个变量中. 例如: int num; num = Conve ...

  5. 各种轮播实现(纯css实现+js实现)

    1.纯Css实现轮播效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  6. 386 Lexicographical Numbers 字典序排数

    给定一个整数 n, 返回从 1 到 n 的字典顺序.例如,给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] .请尽可能的优化算法的时间复杂度和空间复杂度. 输入 ...

  7. [转]URL最大长度问题

    本文转自:http://www.cnblogs.com/henryhappier/archive/2010/10/09/1846554.html 今天在测试Email Ticket的时候发现在进行Ma ...

  8. cocos2dx在windows下搭建环境android报错

    报错:Program bash is not found in PATH   (如果按照我的方法来的话是没有这个错误的,我之前用别的方法的时候有但是后来还是没解决,写出来放到这里做参考吧) 参考原文: ...

  9. CNN结构:场景分割与Relation Network

    参考第一个回答:如何评价DeepMind最新提出的RelationNetWork 参考链接:Relation Network笔记  ,暂时还没有应用到场景中 LiFeifei阿姨的课程:CV与ML课程 ...

  10. IOS 11,UIWebView内容随状态栏高度下移,导致状态栏不透明

    解决方案: 方法1:在html中设置 <meta name="viewport" content="viewport-fit=cover,maximum-scale ...