题目大意:给一棵无根树,找出所有满足下面的条件的点:删除它后,最大子树中的个数最少。

题目分析:两次深搜,第一次找出子树中节点的个数,第二次维护最大子树。

ps:边用vector保存时会超时。。。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<cstring>
  4. # include<vector>
  5. # include<queue>
  6. # include<list>
  7. # include<set>
  8. # include<map>
  9. # include<string>
  10. # include<cmath>
  11. # include<cstdlib>
  12. # include<algorithm>
  13. using namespace std;
  14. # define LL long long
  15.  
  16. const int N=1005;
  17. const int INF=1000000000;
  18.  
  19. struct Edge
  20. {
  21. int to,nxt;
  22. };
  23. int n,cnt=0;
  24. int d[N*50];
  25. int dp[N*50];
  26. int head[N*50];
  27. Edge e[N*100];
  28.  
  29. void add(int u,int v)
  30. {
  31. e[cnt].to=v;
  32. e[cnt].nxt=head[u];
  33. head[u]=cnt++;
  34. }
  35.  
  36. void init()
  37. {
  38. int a,b;
  39. cnt=0;
  40. memset(head,-1,sizeof(head));
  41. for(int i=1;i<n;++i){
  42. scanf("%d%d",&a,&b);
  43. add(a,b);
  44. add(b,a);
  45. }
  46. }
  47.  
  48. void dfs(int u,int fa)
  49. {
  50. d[u]=1;
  51. for(int i=head[u];i!=-1;i=e[i].nxt){
  52. int v=e[i].to;
  53. if(v==fa) continue;
  54. dfs(v,u);
  55. d[u]+=d[v];
  56. }
  57. }
  58.  
  59. void dfs1(int u,int fa)
  60. {
  61. dp[u]=n-d[u];
  62. for(int i=head[u];i!=-1;i=e[i].nxt){
  63. int v=e[i].to;
  64. if(v==fa) continue;
  65. dfs1(v,u);
  66. if(dp[u]<d[v])
  67. dp[u]=d[v];
  68. }
  69. }
  70.  
  71. void solve()
  72. {
  73. dfs(1,-1);
  74. dfs1(1,-1);
  75. int minn=INF;
  76. for(int i=1;i<=n;++i)
  77. minn=min(minn,dp[i]);
  78. int flag=false;
  79. for(int i=1;i<=n;++i){
  80. if(dp[i]!=minn) continue;
  81. if(flag) printf(" ");
  82. printf("%d",i);
  83. flag=true;
  84. }
  85. printf("\n");
  86. }
  87.  
  88. int main()
  89. {
  90. while(~scanf("%d",&n))
  91. {
  92. init();
  93. solve();
  94. }
  95. return 0;
  96. }

  

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 3107] Godfather 链式前向星+树的重心

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

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

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

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

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

  5. POJ 1655 Balancing Act && POJ 3107 Godfather

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

  6. POJ 3107.Godfather 树形dp

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

  7. POJ 3107 Godfather (树重心)

    题目链接:http://poj.org/problem?id=3107 题意: 数重心,并按从小到大输出. 思路: dfs #include <iostream> #include < ...

  8. poj 3107 Godfather(树的重心)

    Godfather Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7885   Accepted: 2786 Descrip ...

  9. POJ 3107 Godfather (树形dp)

    题目链接 虽然题目不难,但是1A还是很爽, 只是刚开始理解错题意了,想了好久. 还有据说这个题用vector会超时,看了以后还是用邻接吧. 题意: 给一颗树,保证是一颗树,求去掉一个点以后的联通块里节 ...

  10. POJ 3107 Godfather(树的重心)

    嘟嘟嘟 题说的很明白,就是求树的重心. 我们首先dfs一遍维护每一个点的子树大小,然后再dfs一遍,对于一个点u,选择子树中size[v]最小的那个和n - size[u]比较,取最大作为删除u后的答 ...

随机推荐

  1. MATLAB axes

    本帖由MATLAB技术论坛(http://www.matlabsky.com)原创,更多精彩内容参见http://www.matlabsky.com axes ★★★★★ 功能 创建坐标系图形对象 语 ...

  2. InterruptedException 线程异常

    InterruptedException 这个异常一般发生在线程中,当一个正在执行的线程被中断时就会出现这个异常-! 简单的说就是:假如有两个线程,第一个线程正在运行,第二个没有运行,这时第二个线程启 ...

  3. ACM -二分图题目小结

    暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063  过 ...

  4. SQLSERVER数据库中批量导入数据的几种方法

    第一:使用Select Into 语句 如果企业数据库都是采用SQL Server数据库的话,则可以利用select into语句实现数据的导入. select into语句的作用是把数据从另外一个数 ...

  5. mysql 与 oracle 比较(一)group by 容易产生的误解

    注:本文并不是列举出两者之间的所有不同,而是在实际应用中发现的不同的功能点或者处理模式,之所以记录下来,就是为了提醒自己,勿忘 group by : (1)oracle 中,总所周知,select ( ...

  6. Java 嵌套作用域

    在C/C++中,当一个块处于另一个块作用域内的时候,内层定义的变量会把外层的变量隐藏, 遵循所谓的就近原则. 在Java中,在内层定义与外层同名的变量是禁止的! 如下: int i = 0; for( ...

  7. 【Oracle XE系列之三】使用OMF方式手工创建Oracle XE数据库

    环境:win10_X64_Pro 1.创建数据库实例,实例名为PF C:\oraclexe\app\oracle\product\11.2.0\server\bin>oradim -new -s ...

  8. Ajax中的eval函数的用法

    eval的定义和使用: Eval它是用来计算某个字符串,并且执行其中的JavaScript代码. 语法: 1) eval函数接受一个string这个参数,并且这个参数是必须的,这个参数就是要计算的这个 ...

  9. 制作0.5px像素的细条

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...

  10. Entityframework批量删除

    UI层 <a href="#" onclick="DelData(0);return false;" id="a_del" class ...