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. 部分Android手机拍照后照片被旋转的解决方案

      在部分Android手机(如MT788.Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°.180°.270°),这个情况很不符合预期.仔细分析了一下,因为照片属性中是存储了 ...

  2. final修饰符

    final本身的含义是"最终的,不可变的",它可以修饰非抽象类,非抽象方法和变量.注意:构造方法不能使用final修饰,因为构造方法不能被继承,肯定是最终的. final修饰的类: ...

  3. PPM图片格式及其C读写代码

    PPM图像格式介绍 PPM图像格式是由Jef Poskanzer 大叔,在我出生那一年,也就是1991年所创造的,碰巧的是PPM也是天蝎座. PPM(Portable Pixmap Format)还有 ...

  4. python之路十五

    CSS position 属性 定义和用法position 属性规定元素的定位类型.说明这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身 ...

  5. win10 设置声卡驱动 --- 解决喇叭没有声音!

    win10 设置声卡驱动 --- 解决喇叭没有声音! 1)安装驱动,必须能够在:"控制面板\硬件和声音" 下找到安装好的: "Realtek高清晰音频管理器" ...

  6. 转:IOC框架

    CSND上看了王泽滨的博客关于IOC的,觉得说的很透彻,地址为:http://blog.csdn.net/wanghao72214/article/details/3969594 1 IoC理论的背景 ...

  7. iOS CocoaPods 版本安装问题

    今天安装salesforce中的pods,这是里面的podfile # Uncomment this line to define a global platform for your project ...

  8. Target runtime com.genuitec.runtime.generic.jee60 is not defined

    转载自:http://jingyan.baidu.com/article/d7130635338e3f13fdf47518.html 用eclipse加载别人的工程,报错Target runtime ...

  9. Alipay秘钥问题

    有三种秘钥一个是应用公钥 一个是支付宝公钥 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { text-d ...

  10. 安装两个tomcat

    编辑环境变量:vi /etc/profile 加入以下代码(tomcat路径要配置自己实际的tomcat安装目录) ##########first tomcat########### CATALINA ...