题目描述

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

输入

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

输出

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

样例输入

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


题解

树形dp

f[x]表示子树i中所有点到点x的距离之和。

g[x]表示整个树中所有点到点x的距离之和。

然后我们发现f和g都是可以递推求出来的,并且f[1]=g[1]。

于是可以先求f[x],f[x]=∑(f[to[i]]+si[to[i]])。

因为这些点到x的距离比到to[i]多1,总共有si[to[i]]个点,所以加上si[to[i]]。

然后g[1]=f[1],再递推求g[to[i]],g[to[i]]=g[x]+n-2*si[to[i]]。

因为有n-si[to[i]]个点到to[i]的距离比到x多1,所以加n-si[to[i]];有si[to[i]]个点到to[i]的距离比到x少1,所以再减si[to[i]],最后就是g[x]+n-2*si[to[i]]。

最后求g[x]的最大值即可。

#include <cstdio>
int n , head[1000001] , to[2000001] , next[2000001] , cnt;
long long si[1000001] , f[1000001] , g[1000001];
void add(int x , int y)
{
to[++cnt] = y;
next[cnt] = head[x];
head[x] = cnt;
}
void dfs1(int x , int fa)
{
int i;
si[x] = 1;
for(i = head[x] ; i ; i = next[i])
{
if(to[i] != fa)
{
dfs1(to[i] , x);
si[x] += si[to[i]];
f[x] += f[to[i]] + si[to[i]];
}
}
}
void dfs2(int x , int fa)
{
int i;
for(i = head[x] ; i ; i = next[i])
{
if(to[i] != fa)
{
g[to[i]] = g[x] + n - 2 * si[to[i]];
dfs2(to[i] , x);
}
}
}
int main()
{
int i , x , y , ans = 0;
scanf("%d" , &n);
for(i = 1 ; i < n ; i ++ )
scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
dfs1(1 , 0);
g[1] = f[1];
dfs2(1 , 0);
for(i = 1 ; i <= n ; i ++ )
if(g[ans] < g[i])
ans = i;
printf("%d\n" , ans);
return 0;
}

最新文章

  1. [stm32] SIM808模块之发短信\GPS\TCP\HTTP研究
  2. 《项目经验》--后台一般处理程序向前台JS文件传递JSON,JS解析JSON,将数据显示在界面--显示在DropDownList 或 显示在动态创建的table中
  3. Strong AI Versus Weak AI
  4. 磁盘检验[转自vbird]
  5. python challenge 待续中
  6. BZOJ 2330 SCOI 2011 糖果
  7. 翻译题(map使用)
  8. JS定时器设置、快速取消
  9. Zabbix Agent for Windows部署(五)
  10. kaldi通用底层矩阵运算库——CUDA
  11. java实现多个文件以压缩包导出到本地
  12. Servlet(九):web.xml文件和server.xml文件
  13. P1035 调和级数
  14. 模拟位置 定位 钉钉打卡 运动轨迹 MD
  15. Java RMI 使用例子
  16. java.lang.UnsupportedClassVersionError: xxx/xxxClass : Unsupported major.minor version 51.0【转】
  17. 记录在Centos下安装和使用Git的过程,从github上克隆仓库和提交。
  18. linux-ubuntu 下R无法安装rjava模块的原因及解决方案
  19. ibatis 引入多个model
  20. PADS Layout如何进行“ECO对比更新”

热门文章

  1. 阿里巴巴Java开发手册——速读记录
  2. 北京Uber优步司机奖励政策(1月19日)
  3. QtChart 初体验
  4. MySQL不能连接本地数据库10061
  5. Oracle 字段拆分替换在合并成一条
  6. 「日常训练」 Yukari&#39;s Birthday(ZOJ-3665)
  7. OpenSUSE 11 安装Qt5.0,失败,失败,失败,留个坑,以后来填,万一实现了呢
  8. linux系统简单命令
  9. 骰子涂色 (Cube painting,UVa 253)
  10. Android开发-API指南-&lt;uses-permission&gt;