题意:

Description

Last years Chicago was full of gangster fights and strange murders. The chief of the police got really tired of all these crimes, and decided to arrest the mafia leaders.

Unfortunately, the structure of Chicago mafia is rather complicated. There are n persons known to be related to mafia. The police have traced their activity for some time, and know that some of them are communicating with each other. Based on the data collected, the chief of the police suggests that the mafia hierarchy can be represented as a tree. The head of the mafia, Godfather, is the root of the tree, and if some person is represented by a node in the tree, its direct subordinates are represented by the children of that node. For the purpose of conspiracy the gangsters only communicate with their direct subordinates and their direct master.

Unfortunately, though the police know gangsters’ communications, they do not know who is a master in any pair of communicating persons. Thus they only have an undirected tree of communications, and do not know who Godfather is.

Based on the idea that Godfather wants to have the most possible control over mafia, the chief of the police has made a suggestion that Godfather is such a person that after deleting it from the communications tree the size of the largest remaining connected component is as small as possible. Help the police to find all potential Godfathers and they will arrest them.

Input

The first line of the input file contains n — the number of persons suspected to belong to mafia (2 ≤ n ≤ 50 000). Let them be numbered from 1 to n.

The following n − 1 lines contain two integer numbers each. The pair ai, bi means that the gangster ai has communicated with the gangster bi. It is guaranteed that the gangsters’ communications form a tree.

Output

Print the numbers of all persons that are suspected to be Godfather. The numbers must be printed in the increasing order, separated by spaces.

Sample Input

6
1 2
2 3
2 5
3 4
3 6

Sample Output

2 3

​ 题目大体意思就是给出一个无向无环图,从中去掉一个结点使其分为一个或多个无向无环图,问去掉哪个结点分成的最大树的结点数最小,把所有符合条件的结点按从小到大的顺序输出出来

思路:

​ 我们可以把无向无环图看作是一棵树,网上说就是求树的所有重心(也就是结点到其它结点的距离和最小)。我的思路也和网上查不多。我们可以强制以1作为根节点,然后由叶到根求每个节点作为根节点的子树的结点和。利用dp【i】存储去掉i结点分成的k颗树的最大结点数,那么dp【i】为i的全部儿子结点为根的子树的最大值与n - (i为根节点的子树结点数),取两者的较大值即为dp【i】

​ 因为是一遍遍历嘛~复杂度大概为O(n),用vector存储邻接表2s竟然TLE我的天!!!换成数组模拟vector只有400多ms,再加上快速读模版只耗费了110ms,就酱紫~

代码:

#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#define N 50005
using namespace std;namespace IO {const int MX = 8e5;char buf[MX];int c, sz;void begin() {c = 0;sz = fread(buf, 1, MX, stdin);}inline bool read(int &t) {while (c < sz && (buf[c] < '0' || buf[c] > '9')) {c++;}if (c >= sz) return false;for (t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) {t = t * 10 + buf[c] - '0';}return true;}
}int n;
int point[2 * N];
int last[2 * N];
int flag[N];
int num[N];
int dp[N];
int ans[N];int read() {char c = getchar();int x = 0;while (c < '0' || c > '9') {c = getchar();}while (c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}return x;
}void init() {int a, b, tot = 0;;for (int i = 0; i < n - 1; i++) {IO::read(a);IO::read(b);point[++tot] = b;last[tot] = flag[a];flag[a] = tot;point[++tot] = a;last[tot] = flag[b];flag[b] = tot;}
}void dfs(int inx, int father) {num[inx] = 1;for (int i = flag[inx]; i != 0; i = last[i]) {int son = point[i];if(son == father) continue;dfs(son, inx);num[inx] += num[son];dp[inx] = max(dp[inx], num[son]);}dp[inx] = max(dp[inx], n - num[inx]);return;
}int main() {IO::begin();IO::read(n);init();dfs(1, -1);int minn = 0x3f3f3f3f;int tot = 0;for (int i = 1; i <= n; i++) {if(minn > dp[i]) {tot = 0;ans[tot++] = i;minn = dp[i];} else if(minn == dp[i]) {ans[tot++] = i;}}for (int i = 0; i < tot; i++) {if (i == tot - 1) printf("%d\n", ans[i]);else printf("%d ", ans[i]);}return 0;
}

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

POJ3107 Godfather 树形dp+模拟vector相关推荐

  1. BZOJ 2651 城市改建 树形DP+模拟?

    题意 给一颗树,删除一条边再加一条边,使它仍为一颗树且任意两点间的距离的最大值最小. 题目数据范围描述有问题,n为1或重建不能使任意两点距离最大值变小,可以输出任意答案. 分析 删除一条边后会使它变成 ...

  2. 2011分区联赛模拟试题 电子眼(树形dp)

    2011分区联赛模拟试题 电子眼 Description 中山市石一个环境优美.气候宜人的小城市.因为城市的交通并不繁忙,市内的道路网很稀疏.准确地说,中山市有N-1条马路和N个路口,每条马路连接两个 ...

  3. 【GDOI2018模拟7.7】暴力大神hxx 树形dp

    题意:给你n个嵌套for语句,然后从第二个开始每一个循环的起点或者是终点是变量,问你会循环多少次. 这是一道好题. 手玩一下可以很容易发现,上下之间有可以递推的关系,但是直接递推会炸,所以需要dp. ...

  4. 【SSL 2119 2011分区联赛模拟试题】电子眼【树形DP】

    Description 中山市石一个环境优美.气候宜人的小城市.因为城市的交通并不繁忙,市内的道路网很稀疏.准确地说,中山市有N-1条马路和N个路口,每条马路连接两个路口,每两个路口之间最多只有一条马 ...

  5. jzoj5814 [NOIP提高A组模拟2018.8.14] 树 树形dp

    Description 梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到 点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中 ...

  6. POJ3107 Godfather树的重心

    POJ3107 Godfather 树的重心模板题 讲解在注释里,树的重心还是比较好理解的 #include<cstdio> #include<iostream> using ...

  7. 【树形DP】树的重心详解+多组例题详解

    目录 定义: 性质: 算法分析: POJ 1655 Balancing Act(求重心) POJ 3107 Godfather P1364 医院设置(树形DP) 定义: 树的重心也叫树的质心.对于一棵 ...

  8. 【WC2019】数树【子集反演】【结论】【树形dp】【生成函数】【函数求导】【多项式全家桶】

    题意:有两棵基于同一点集的树,点集大小为 nnn ,两棵树中有 opopop 棵未确定,可以取所有 nn−2n^{n-2}nn−2 种可能.给每个点染上 [1,y][1,y][1,y] 中的一个颜色, ...

  9. HDU - 2196(树形DP)

    题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...

最新文章

  1. java对象排序_java对象排序(Comparable)详细实例
  2. WEB文档在线预览解决方案
  3. java 回调模式_总结!!!总结!!!java回调以及future模式
  4. r语言和python-PythonR语言-python和r相遇
  5. wxHtml 示例:帮助浏览器
  6. 全国计算机一级计算机基础及WPS考试题型,计算机一级考试科目有哪些?Wps和ms考试的题目一样吗?...
  7. 【剑指offer】面试题60:n个骰子的点数(Java)
  8. 【Java】Socket网络编程解读与实战
  9. const、volatile、mutable关键字
  10. hibernate中antlr对于hql的词法分析源码解析
  11. vtkSuperquadricSource:创建以原点为中心的多边形超二次曲面
  12. 报告PPT|Python编程之美(45页)
  13. QT 多线程程序设计 -互斥
  14. tomcat中三种部署项目的方法(转)
  15. 基于java宠物商店管理系统(java毕业设计)
  16. Android基础:ViewPage
  17. xp系统搭建iscsi服务器,配置Microsoft Windows XP对MDS/IPS-8的iSCSI主机
  18. 把surfer的.grd文件改写为.txt
  19. 家庭网关——开启数字家庭的钥匙
  20. AGV (Automated guided vehicle)基础(一) - AGV的导航种类

热门文章

  1. linux内核源码分析之CFS调度
  2. CST画椭圆螺旋曲线elliptical spiral的方法
  3. Spring AOP源码解析-拦截器链的执行过程
  4. 用python刷微信阅读_使用python让微信读书自动翻页
  5. android手机电视互动,手机APP控制电视 长虹智能机多屏互动体验(组图)
  6. java dispo lock_java实现文件上传和下载(1)
  7. opengl剪裁空间和视口空间中不遵从右手定则,而是遵从左手定则
  8. Linux配置 难记的命令 和 Sheel编程学习总结常用备注
  9. (考研)数据结构及算法
  10. python调整图片色相,对应ps的色相值