题目描述

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

输入输出格式

输入格式

第一行一个数$n$,表示树上共有$n$个点
接下来$n-1$行,表示$n-1$条边;每行两个数,表示这条边的两个端点

输出格式

一个数,表示以该节点为根时,所有点的深度之和最大

思路

  • 设$u$为$v$的父节点
  • 用$f[u]$表示以u为根节点时的最大深度和,用$size[u]$表示u的子树大小
  • 以$u$为根的树,变成以儿子$v$为根的树,
    • 那么所有在$v$的子树上的节点的深度都会减1,深度和就会减少$size[v]$,
    • 所有不在$v$的子树上的节点的深度都会+1,深度和就会加上$n-size[v]$;

得到公式
$$f[v]=f[u]+n-2*size[v]$$

  • 所以,只需求出以1为根节点时的深度和;剩下的答案都可以递推出来

代码

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register int
using namespace std;
int const maxn=1e6+50;
inline int read(){
int x=0,w=1;
char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x*w;
}
long long sum[maxn],size[maxn],ans[maxn];
int tot=1,dep[maxn],n,h[maxn];
struct data {
int v,next;
}e[maxn<<1];
inline void add(int u,int v) {
e[tot].v=v;
e[tot].next=h[u];
h[u]=tot++;
}
void dfs(int u,int f){
sum[u]=dep[u]=dep[f]+1;size[u]=1;
for(re i=h[u];i;i=e[i].next) {
int v=e[i].v;
if(v==f) continue;
dfs(v,u);
size[u]+=size[v];
sum[u]+=sum[v];
}
}
void DFS(int u,int f) {
for(re i=h[u];i;i=e[i].next) {
int v=e[i].v;
if(v==f) continue;
ans[v]=ans[u]+n-2*size[v];
DFS(v,u);
}
}
int main() {
n=read();
for(re i=1,a,b;i<n;++i) {
a=read(),b=read();
add(a,b);add(b,a);
}
dfs(1,0);
ans[1]=sum[1];
DFS(1,0);
int pos=0;
for(re i=1;i<=n;++i) {
if(ans[pos]<ans[i]) pos=i;
}
printf("%d\n",pos);
return 0;
} /*
8
1 4
5 6
4 5
6 7
6 8
2 4
3 4 */

【题解】Luogu p3478 [POI2008]STA-Station 动态规划的更多相关文章

  1. 1131: [POI2008]Sta

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

  2. bzoj 1131 [POI2008]Sta 树形dp 转移根模板题

    [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1889  Solved: 729[Submit][Status][Discu ...

  3. 洛谷P3478 [POI2008]STA-Station

    P3478 [POI2008]STA-Station 题目描述 The first stage of train system reform (that has been described in t ...

  4. BZOJ 1131: [POI2008]Sta( dfs )

    对于一棵树, 考虑root的答案向它的孩子转移, 应该是 ans[son] = (ans[root] - size[son]) + (n - size[son]). so , 先 dfs 预处理一下, ...

  5. CJOJ 1087 【NOIP2010】乌龟棋 / Luogu 1541 乌龟棋(动态规划)

    CJOJ 1087 [NOIP2010]乌龟棋 / Luogu 1541 乌龟棋(动态规划) Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个 ...

  6. CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划)

    CJOJ 1131 机器分配 / Luogu 2066 机器分配 (动态规划) Description Luogu: 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国 ...

  7. Luogu 1063 能量项链(动态规划)

    Luogu 1063 能量项链(动态规划) Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某 ...

  8. Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)

    Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...

  9. Luogu 1220 关路灯(动态规划)

    Luogu 1220 关路灯(动态规划) Description 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项 ...

随机推荐

  1. Asp.NetCore Web开发之模型验证

    在开发中,验证表单数据是很重要的一环,如果对用户输入的数据不加限制,那么当错误的数据提交到后台后,轻则破坏数据的有效性,重则会导致服务器瘫痪,这是很致命的. 所以进行数据有效性验证是必要的,我们一般通 ...

  2. CRM系统自动化业务流程的好处

    CRM系统的自动化可以简单化企业大部分工作,而且覆盖销售,市场,服务和财务部门,使团队有大量时间花在业务流程上. CRM系统自动化的建立是为了更好地使工作更为简单且便于管理,自动化释放出来员工的时间, ...

  3. 使用PuTTY连接Azure VM

    使用PuTTY连接Azure VMhtml { -webkit-print-color-adjust: exact } * { box-sizing: border-box; -webkit-prin ...

  4. [re模块、json&pickle模块]

    [re模块.json&pickle模块] re模块 什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则 ...

  5. docker 的常见命令行解析

    1.查看本地镜像 sudo docker images 2.查看本地容器 sudo docker ps 3.根据Dockerfile制作镜像命令 sudo docker build -t Myimag ...

  6. VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置

    VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置~~ 想必很多人和我一样,想用vscode编程c++,easyx库不支持MinGW,一般人都是直接使用vs2019安装e ...

  7. ip_conntrack or nf_conntrack : table full, dropping packet

    nf_conntrack: table full, dropping packet ip_conntrack or nf_conntrack : table full, dropping packet ...

  8. 还可以使用 -c 参数来显示全部内容,并标出不同之处 diff -c test2.txt test1.txt

    二.实例 在test目录下存放了两个文本文件,test1.txt  test2.txt . 比较这两个文件的异同. diff  test1.txt   test2.txt     "5c5& ...

  9. echo -n -e "请输入重启间隔的时间(分钟):\t"

    echo -n -e "请输入重启间隔的时间(分钟):\t"read interval##echo -n "Your choice is " # 加上 -n 可 ...

  10. .NET6系列:C#10新功能预览

    系列目录     [已更新最新开发文章,点击查看详细] 2021年4月19日微软发布公告称将于今年夏季发布首款64位的 Visual Studio 2022,2021年5月20日又发布了 Visual ...