题目

The first stage of train system reform (that has been described in the problem Railways of the third stage of 14th Polish OI.

However, one needs not be familiar with that problem in order to solve this task.) has come to an end in Byteotia. The system consists of bidirectional segments of tracks that connect railway stations. No two stations are (directly) connected by more than one segment of tracks.

Furthermore, it is known that every railway station is reachable from every other station by a unique route. This route may consist of several segments of tracks, but it never leads through one station more than once.

The second stage of the reform aims at developing train connections.

Byteasar count on your aid in this task. To make things easier, Byteasar has decided that:

one of the stations is to became a giant hub and receive the glorious name of Bitwise, for every other station a connection to Bitwise and back is to be set up, each train will travel between Bitwise and its other destination back and forth along the only possible route, stopping at each intermediate station.

It remains yet to decide which station should become Bitwise. It has been decided that the average cost of travel between two different stations should be minimal.

In Byteotia there are only one-way-one-use tickets at the modest price of bythaler, authorising the owner to travel along exactly one segment of tracks, no matter how long it is.

Thus the cost of travel between any two stations is simply the minimum number of tracks segments one has to ride along to get from one stations to the other.

Task Write a programme that:

reads the description of the train system of Byteotia, determines the station that should become Bitwise, writes out the result to the standard output.

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

输入格式

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

输出格式

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

题解

随便取一个点做根,比如1号节点,然后从1号节点出发dfs每个节点,算出每棵子树的大小和每个节点的深度

然后再一次dfs,树形dp,求每个点做根时,所有点的深度之和,然后输出最大值即可.

那么转移方程怎么考虑?

这棵树从\(fa\)搜到\(root\)的时候,如何转移?

dp值的含义是所有点的深度,那么在树根从\(fa\)变成\(root\)时,所有点的深度之和怎么变化?

显然红色圈内所有点的深度+1,紫色圈内所有点深度-1

紫色圈内点数就是以\(root\)为根的子树的大小,记为\(size\),则紫色圈内点数就是总点数减去\(size\)即\(n-size\)

所以转移方程就是:

\(dp_{root} = dp_{fa} - size_{root} + (n-size_{root})
\\\ \ \ \ \ \ \ \ \ \ \ = dp_{fa} + n - 2 \times size_{root}
\)

还要注意用long long

代码

#include <cstdio>
const int maxn = 1000005;
int head[maxn], tot, n, ans, fa[maxn], size[maxn], ix, iy;
long long dp[maxn];
struct Edge { int to, next; } edges[maxn << 1];
inline int input() { int t; scanf("%d", &t); return t; }
void add(int x, int y) { edges[++tot].to = y; edges[tot].next = head[x]; head[x] = tot; }
void dfs(int root, int fa) {
size[root] = 1;
for (int x = head[root]; x; x = edges[x].next) {
if (edges[x].to == fa) continue;
dfs(edges[x].to, root);
size[root] += size[edges[x].to];
dp[root] += dp[edges[x].to] + size[edges[x].to];
}
}
void dpf(int root, int fa) {
if (root != 1) dp[root] = dp[fa] + n - size[root] * 2;
for (int x = head[root]; x; x = edges[x].next)
if (edges[x].to != fa) dpf(edges[x].to, root);
}
int main() {
n = input();
for (int i = 1; i < n; i++) add(ix = input(), iy = input()), add(iy, ix);
dfs(1, 0), dpf(1, 0);
for (int i = 1; i <= n; i++) if (dp[i] > dp[ans]) ans = i;
printf("%d\n", ans);
}

BZOJ 1131 [POI2008] STA-Station 题解的更多相关文章

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

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

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

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

  3. BZOJ 1131 [POI2008]Sta(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1131 [题目大意] 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度 ...

  4. BZOJ 1131: [POI2008]Sta

    Description 一棵树,问以那个节点为根时根的总和最大. Sol DFS+树形DP. 第一遍统计一下 size 和 d. 第二遍转移根,统计答案就行了. Code /************* ...

  5. 1131: [POI2008]Sta

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

  6. Bzoj 1131[POI2008]STA-Station (树形DP)

    Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...

  7. BZOJ1131 POI2008 Sta 【树形DP】

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

  8. BZOJ 4033: [HAOI2015]树上染色题解

    BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...

  9. [POI2008]Sta(树形dp)

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

随机推荐

  1. 数据的存储结构浅析LSM-Tree和B-tree

    目录 顺序存储与哈希索引 SSTable和LSM tree B-Tree 存储结构的比对 小结 本篇主要讨论的是不同存储结构(主要是LSM-tree和B-tree),它们应对的不同场景,所采用的底层存 ...

  2. Python面试常用的高级用法,怎么动态创建类?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第16篇文章,今天我们来聊聊Python当中的元类. 元类是Python当中的高级用法,如果你之前从来没见过这个术语 ...

  3. HDFS ha 格式化报错:a shared edits dir must not be specified if HA is not enabled.

    错误内容: Formatting using clusterid: CID-19921335-620f-4e72-a056-899702613a6b2019-01-12 07:28:46,986 IN ...

  4. 手把手带你入门numpy,从此数据处理不再慌【四】

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是numpy专题的第四篇文章,numpy中的数组重塑与三元表达式. 首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape.在保 ...

  5. windows server2012在已有.net4.5框架的基础上安装.net3.5的方法

    我们在一台服务器运行各种程序的时候难免会用到一些好用的但是很老的软件.老软件也就难免需要以前的那种环境来运行,但是老的环境与新的环境往往不兼容.下面我就来讲一讲系统在已有.net4.5的情况下怎么安装 ...

  6. Flask 安装和简单使用

    安装 pip install flask # 1 导入 Falsk from flask import Flask # 2 生成一个 Flask 对象,__name__表示当前文件的名字 app = ...

  7. 6、react中的交互

    1.ajax 再react中使用ajax和直接使用ajax的用法是完全一样的,只要找好路径即可,但是也有不一样的地方,再react中是通过改变状态state来达到让组件重新渲染的效果,并且放ajax的 ...

  8. 【原创】Linux中断子系统(三)-softirq和tasklet

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  9. Mariadb 10.14 mysqldump error: 1049

    Mariadb 10.14 mysqldump error: 1049 Table of Contents 1. 错误信息 2. 解决方法 1 错误信息 执行表导出: mysqldump -uroot ...

  10. Android中的SharedPreferences存储

    一.前言 不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的.也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把 ...