题目链接

虽然题目不难,但是1A还是很爽, 只是刚开始理解错题意了,想了好久。 还有据说这个题用vector会超时,看了以后还是用邻接吧。

题意:

给一颗树,保证是一颗树,求去掉一个点以后的联通块里节点的数目的 最大值最小,求这样的点,并按照递增顺序输出。

分析:

d[father] = max(n-sum, d[son]);   sum代表这个节点以下的全部节点总数, 去掉一个节点的联通块的最大的节点数 等于 整个树里的节点数减去这个节点下的总数 和 子树的数目的

最大值。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <vector>
  8. #define LL __int64
  9. const int maxn = +;
  10. const int INF = <<;
  11. using namespace std;
  12. int head[maxn], vis[maxn], t, d[maxn];
  13. int mi, n;
  14. struct node
  15. {
  16. int u, v, ne;
  17. }e[*maxn];
  18.  
  19. void add(int u, int v)
  20. {
  21. e[t].u = u;
  22. e[t].v = v;
  23. e[t].ne = head[u];
  24. head[u] = t++;
  25. }
  26. int dfs(int son, int fa)
  27. {
  28. int i, tmp, sum = , x; //sum是以son为根节点的子树的全部的节点数
  29. for(i = head[son]; i != -; i = e[i].ne)
  30. {
  31. tmp = e[i].v;
  32. if(tmp == fa) continue; //避免回去。
  33. x = dfs(tmp, son);
  34. sum += x;
  35. d[son] = max(d[son], x);
  36. }
  37. d[son] = max(d[son], n-sum);
  38. if(d[son]<mi)
  39. mi = d[son];
  40. return sum;
  41. }
  42. int main()
  43. {
  44. int i, f;
  45. while(~scanf("%d", &n))
  46. {
  47. memset(e, , sizeof(e));
  48. memset(head, -, sizeof(head));
  49. memset(vis, , sizeof(vis));
  50. memset(d, , sizeof(d));
  51. t = ;
  52. mi = INF;
  53.  
  54. for(i = ; i < n; i++)
  55. {
  56. int u, v;
  57. scanf("%d%d", &u, &v);
  58. add(u, v);
  59. add(v, u);
  60. }
  61. dfs(, -); //把给的树看成以1为根节点。
  62.  
  63. f = ;
  64. for(i = ; i <= n; i++)
  65. {
  66. if(d[i]==mi)
  67. {
  68. if(f)
  69. printf(" %d", i);
  70. else
  71. printf("%d", i);
  72. f = ;
  73. }
  74. }
  75. printf("\n");
  76. }
  77. return ;
  78. }

避免回去的时候也可以用vis[]来标记

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <vector>
  8. #define LL __int64
  9. const int maxn = +;
  10. const int INF = <<;
  11. using namespace std;
  12. int head[maxn], vis[maxn], t, d[maxn];
  13. int mi, n;
  14. struct node
  15. {
  16. int u, v, ne;
  17. }e[*maxn];
  18.  
  19. void add(int u, int v)
  20. {
  21. e[t].u = u;
  22. e[t].v = v;
  23. e[t].ne = head[u];
  24. head[u] = t++;
  25. }
  26. int dfs(int son)
  27. {
  28. int i, tmp, sum = , x;
  29. vis[son] = ;
  30. for(i = head[son]; i != -; i = e[i].ne)
  31. {
  32. tmp = e[i].v;
  33. if(vis[tmp]) continue;
  34. x = dfs(tmp);
  35. sum += x;
  36. d[son] = max(d[son], x);
  37. }
  38. d[son] = max(d[son], n-sum);
  39. if(d[son]<mi)
  40. mi = d[son];
  41. return sum;
  42. }
  43. int main()
  44. {
  45. int i, f;
  46. while(~scanf("%d", &n))
  47. {
  48. memset(e, , sizeof(e));
  49. memset(head, -, sizeof(head));
  50. memset(vis, , sizeof(vis));
  51. memset(d, , sizeof(d));
  52. t = ;
  53. mi = INF;
  54.  
  55. for(i = ; i < n; i++)
  56. {
  57. int u, v;
  58. scanf("%d%d", &u, &v);
  59. add(u, v);
  60. add(v, u);
  61. }
  62. dfs();
  63.  
  64. f = ;
  65. for(i = ; i <= n; i++)
  66. {
  67. if(d[i]==mi)
  68. {
  69. if(f)
  70. printf(" %d", i);
  71. else
  72. printf("%d", i);
  73. f = ;
  74. }
  75. }
  76. printf("\n");
  77. }
  78. return ;
  79. }

POJ 3107 Godfather (树形dp)的更多相关文章

  1. POJ 3107.Godfather 树形dp

    Godfather Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7536   Accepted: 2659 Descrip ...

  2. poj 3107 Godfather 求树的重心【树形dp】

    poj 3107 Godfather 和poj 1655差不多,那道会了这个也就差不多了. 题意:从小到大输出树的重心. 题会卡stl,要用邻接表存树..... #include<iostrea ...

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

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

  4. # [Poj 3107] Godfather 链式前向星+树的重心

    [Poj 3107] Godfather 链式前向星+树的重心 题意 http://poj.org/problem?id=3107 给定一棵树,找到所有重心,升序输出,n<=50000. 链式前 ...

  5. [POJ 1155] TELE (树形dp)

    题目链接:http://poj.org/problem?id=1155 题目大意:电视台要广播电视节目,要经过中转机构,到观众.从电视台到中转商到观众是一个树形结构,经过一条边需要支付成本.现在给你每 ...

  6. Apple Tree POJ - 2486 (树形dp)

    题目链接: D - 树形dp  POJ - 2486 题目大意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值 学习网址:https://blog.c ...

  7. Anniversary party POJ - 2342 (树形DP)

    题目链接:  POJ - 2342 题目大意:给你n个人,然后每个人的重要性,以及两个人之间的附属关系,当上属选择的时候,他的下属不能选择,只要是两个人不互相冲突即可.然后问你以最高领导为起始点的关系 ...

  8. POJ 3342 (树形DP)

    题意 :给出一些上下级关系,要求i和i的直接上级不能同时出现,现在选出一些人构成一个集合,问你这个集合里面的最大人数是都少,同时给出这个最大的人数的集合是否唯一. 思路:树形DP,dp[i][0],表 ...

  9. POJ 2342 (树形DP)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3863   Accepted: 2172 ...

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

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

随机推荐

  1. MYSQL注入天书之数据库增删改介绍

    Background-4 增删改函数介绍 在对数据进行处理上,我们经常用到的是增删查改.接下来我们讲解一下mysql 的增删改.查就是我们上述总用到的select,这里就介绍了. 增加一行数据.Ins ...

  2. ios下最简单的正则,RegexKitLite

    ios下最简单的正则,RegexKitLite 1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中.备用地址:http://www.coco ...

  3. IOS第三方地图-百度地图集成

    百度地图官网: http://developer.baidu.com/map/index.php?title=iossdk 照上面吧百度地图sdk集成到工程 然后在pilst文件中加入: 如果地图没有 ...

  4. HDU 1978 How many ways(动态规划)

    How many ways http://acm.hdu.edu.cn/showproblem.php?pid=1978 Problem Description 这是一个简单的生存游戏,你控制一个机器 ...

  5. jvm性能调优---jstat的用法

    Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令 ...

  6. NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

    http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言   当管理大量连接时,特别 ...

  7. 【uva1502/hdu4117-GRE Words】DP+线段树优化+AC自动机

    这题我的代码在hdu上AC,在uva上WA. 题意:按顺序输入n个串以及它的权值di,要求在其中选取一些串,前一个必须是后一个的子串.问d值的和最大是多少. (1≤n≤2×10^4 ,串的总长度< ...

  8. select into from和insert into select from两种表复制语句区别

    select into from和insert into select from两种表复制语句都是将源表source_table的记录插入到目标表target_table,但两句又有区别. 第一句(s ...

  9. [转载]U3d常规性能优化技巧

    以下技巧并不是必须的,但是对于想要提升游戏性能的人来说应该还是很不错的. 优化的常规技巧 n 剖析你的游戏. 不要花费时间来优化那些晦涩的代码或者缩减图形文件的大小,除非这是你游戏的瓶颈.第一次剖析你 ...

  10. Cloudinsight Agent install script

    #!/bin/bash # Cloudinsight Agent install script. set -e logfile="ci-agent-install.log" gis ...