BZOJ 1131 [POI2008] STA-Station 题解
题目
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 题解的更多相关文章
- BZOJ 1131: [POI2008]Sta( dfs )
对于一棵树, 考虑root的答案向它的孩子转移, 应该是 ans[son] = (ans[root] - size[son]) + (n - size[son]). so , 先 dfs 预处理一下, ...
- bzoj 1131 [POI2008]Sta 树形dp 转移根模板题
[POI2008]Sta Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1889 Solved: 729[Submit][Status][Discu ...
- BZOJ 1131 [POI2008]Sta(树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1131 [题目大意] 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度 ...
- BZOJ 1131: [POI2008]Sta
Description 一棵树,问以那个节点为根时根的总和最大. Sol DFS+树形DP. 第一遍统计一下 size 和 d. 第二遍转移根,统计答案就行了. Code /************* ...
- 1131: [POI2008]Sta
1131: [POI2008]Sta Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 783 Solved: 235[Submit][Status] ...
- Bzoj 1131[POI2008]STA-Station (树形DP)
Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...
- BZOJ1131 POI2008 Sta 【树形DP】
BZOJ1131 POI2008 Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=10 ...
- BZOJ 4033: [HAOI2015]树上染色题解
BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...
- [POI2008]Sta(树形dp)
[POI2008]Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面 ...
随机推荐
- 用户和用户组管理-影子文件shadow
ll /etc/shadow 由于shadow文件的权限,所以,只有root可以读 vi /etc/shadow 一共有九列信息: 第一列表示用户名:第二列表示经过加密之后的密码,如果密码是!!或者* ...
- 浅谈js原型
前言 突发奇想,想写一篇原型的文章,也可能是因为对原型有更深的理解吧,在这里做个记录,来记录下自己的理解加深下记忆. 总之,希望本文的内容能够对您的学习或者工作有所帮助.另,如果有任何的错误或者不足请 ...
- Centos7.x RPM安装ELK 7.5.0
一.环境介绍 单位需要分析tomcat 日志和业务日志,比较以后还是选择用ELK 来进行日志的分析,以及可视化的展示. 系统环境 服务器: 1.AWS EC2 2C8G [root@ip-10-0 ...
- javaScript的执行机制-同步任务-异步任务-微任务-宏任务
一.概念理解 1.关于javascript javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变.所以一切javascr ...
- 09.Django-信号
目录 Django中的信号及其用法 Django中内置的signal 内置信号的使用 自定义信号 Django中的信号及其用法 Django中提供了"信号调度",用于在框架执行操作 ...
- Php7安装pdo_pgsql,pgsql扩展
通过地址http://pecl.php.net/package/PDO_PGSQL下载PDO扩展包 找到php自带的ext目录里的pgsql库 第二步: 切换目录到pgsql 第三步: 找到phpiz ...
- 十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的
需求是 上传Excel 读取里面的数据.根据Excel中某一个字段,与数据表中的一个字段的唯一性.然后把 Excel表中数据和数据库表中数据一次更改.本次测试一次更新31条数据. 本次测试基于帝国cm ...
- @luogu - P6109@ [Ynoi2009]rprmq
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一个 n×n 的矩阵 a,初始全是 0,有 m 次修改操作和 ...
- Mysql:bit类型的查询与插入
原文链接:https://www.cnblogs.com/cuizhf/archive/2013/05/17/3083988.html Mysql关于bit类型的用法: 官方的资料如下: 9.1.5. ...
- java中Proxy类初探
在java中提供了一个动态代理类,这个类位于java.lang.reflect包中的Proxy类中.什么是动态代理类呢?就是可以在运行时创建一个实现了一组给定接口的新类.听上去有点高深的样子,其实是提 ...