Description
  给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大

Input
  给出一个数字N,代表有N个点.N<=1000000 下面N-1条边.

Output
  输出你所找到的点,如果具有多个解,请输出编号最小的那个.

Sample Input
8
1 4
5 6
4 5
6 7
6 8
2 4
3 4

Sample Output
7

题解:

  都说是裸树形DP,其实我做的时候就是把它当成搜索去做了,当然是一个意思。假设当前的根为1,先求出每棵子树的大小,以及所有点的深度之和。考虑到我们换根会带来的影响,一部分点的深度会减小,一部分点的深度会增加。故假设我们当前在第i号节点,递归到他的一个儿子节点j,则总深度的变化为以第i号节点所有儿子节点的子树的节点和减去剩余的节点和。故把所有节点的情况都考虑一次,最后求出最大值就行了。

  但是,有一个很坑的地方,如果你是用的Windows,用DFS基本上是没有戏了,因为节点数量很多,在Windows环境下不能开启无限栈,所以还是用BFS吧,当然你也可以手写栈,但是没必要作死。

代码(本地非官方数据83分,用的DFS):

--------------------------------------------------------------------------------------------------

#include <cstdio>
#define MAXN 1000005

int max(int a, int b) { return a > b ? a : b; }

struct Edge { int v, next; } edge[MAXN << 1];

int n, u, v, tot[MAXN], now, h[MAXN];
int fa[MAXN], siz[MAXN], ans, maxt;

void addEdge(int u, int v) { now++, edge[now] = (Edge) {v, h[u]}, h[u] = now; }

void DFS(int o)
{
  siz[o] = 1;
  for (int x = h[o]; x; x = edge[x].next)
  {
    int v = edge[x].v;
    if (v != fa[o]) fa[v] = o, DFS(v), siz[o] += siz[v], tot[o] += tot[v] + siz[o];
  }
}

void DFS2(int o)
{
  if (o != 1) tot[o] = tot[fa[o]] - siz[o] * 2 + n;
  for (int x = h[o]; x; x = edge[x].next)
  {
    int v = edge[x].v;
    if (v != fa[o]) DFS2(v);
  }
}

int main()
{
  freopen("sta.in", "r", stdin);
  freopen("sta.out", "w", stdout);
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++)
    scanf("%d %d", &u, &v), addEdge(u, v), addEdge(v, u);
  DFS(1), DFS2(1);
  for (int i = 1; i <= n; i++)
    if (maxt < tot[i]) maxt = tot[i], ans = i;
  printf("%d", ans);

}

--------------------------------------------------------------------------------------------------

[BZOJ1131][POI2008] Sta 树的深度的更多相关文章

  1. [BZOJ1131/POI2008]Sta树的深度

    Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...

  2. BZOJ1131 POI2008 Sta 【树形DP】

    BZOJ1131 POI2008 Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=10 ...

  3. STA树的深度(树型DP)

    STA树的深度 题目大意 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Outpu ...

  4. BZOJ1131 [POI2008]Sta 其他

    原文链接http://www.cnblogs.com/zhouzhendong/p/8081100.html 题目传送门 - BZOJ1131 题意概括 给出一个N个点的树,找出一个点来,以这个点为根 ...

  5. BZOJ1131[POI2008]Sta——树形DP

    题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...

  6. bzoj千题计划151:bzoj1131: [POI2008]Sta

    http://www.lydsy.com/JudgeOnline/problem.php?id=1131 dp[i]=dp[fa[i]]-son[i]+n-son[i] #include<cst ...

  7. bzoj1131: [POI2008]Sta

    思路:首先先求出以1为根的答案,然后考虑由i转移到i的儿子的答案的变化,显然以son[i]为根的子树的所有结点的深度都会减一,其余的点的深度都会加一,然后就可以直接O(n)求出所有结点的答案,然后取m ...

  8. [bzoj1131][POI2008]Sta_树形dp

    Sta bzoj-1131 POI-2008 题目大意:给定一棵n个点的树,求一个根,使得深度和最大. 注释:$1\le n \le 10^6$. 想法:扭一扭即可. 扭的时候看看这个点当没当过根. ...

  9. 【BZOJ-1131】Sta 树形DP

    1131: [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1150  Solved: 378[Submit][Status] ...

随机推荐

  1. Django Restful Framework (二): ModelSerializer

    时常,你需要对django model 的实例进行序列化.ModelSerializer 类提供了一个捷径让你可以根据 Model 来创建 Serializer. ModelSerializer 类和 ...

  2. maven向本地仓库导入jar包(处理官网没有的jar包)

    对于官网没有的jar包,maven向本地仓库导入jar包用如下命令 mvn install:install-file -DgroupId=包名 -DartifactId=项目名 -Dversion=版 ...

  3. bzoj4237 稻草人

    我是萌萌的传送门 题意不难理解吧-- 一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着--(好吧我已经忘了--)然而我第一眼看完题之后的思路是数据结构 ...

  4. Linux下的压缩和解压缩命令——gzip/gunzip

    gzip命令 gzip命令用来压缩文件.gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处".gz"扩展名. gzip是在Linux系统中经常使用的一个对文件进行压 ...

  5. python scipy学习-曲线拟合

    根据某地每月的平均温度[17, 19, 21, 28, 33, 38, 37, 37, 31, 23, 19, 18]拟合温度函数. import numpy as np import matplot ...

  6. PHPSTORM设置新建PHP文件头部注释

    1.选择 File|setting 2.在Editor|File and Code Templates,见下图标记更改即可

  7. 基于SS5服务端的Socks5客户端

    SS5停止更新已经好几年了,用作socks5代理的服务端还是比较稳定的.但是如果要使用加密账号和密码的协议,有些坑需要去填. 1.服务端的账号密码验证方式配置为“s”时,客户端进行协议验证时,需要用“ ...

  8. 【Python】if __name__ == "__main__"做了什么?

    在Python的很多源文件中,会有这样的语句: if __name__ == '__main__': # script code here 比如有两个源文件A.py和B.py,都有上面的代码:在B.p ...

  9. 安卓手机 虚拟键盘输入用 position:fixed解决 !!!

    下面 主要代码 方便看. 样式 <style> *{ margin:0; padding:0; } html{ height:100%;/*关键代码*/ } body{ height:10 ...

  10. acm 1002 算法设计

    最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是 ...