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 下面 ...
随机推荐
- 信道估计(channel estimation)图解——从SISO到MIMO原理介绍
1. 引言 在所有通信中,信号都会通过一个介质(称为信道),并且信号会失真,或者在信号通过信道时会向信号中添加各种噪声.正确解码接收到的信号而没有太多错误的方法是从接收到的信号中消除信道施加的失真和噪 ...
- Fiddler工具学习使用总结
1.初识fiddler: 作用:截获http/HTTPS请求,查看截获的请求内容,伪造客户端请求和服务器响应,测试网站性能,解密https的web会话,提供插件. 工作环境:支持素有操作系统和所有浏览 ...
- Redis集群方式
Redis有三种集群方式:主从复制,哨兵模式和集群. 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令: 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用 ...
- 实验二 Linux系统简单文件操作命令
项目 内容 这个作业属于哪个课程 班级课程的主页链接 这个作业的要求在哪里 作业要求链接接地址 学号-姓名 17041428-朱槐健 作业学习目标 1.学习在Linux系统终端下进行命令行操作 2.掌 ...
- vuex登录验证及保持登录状态
不知道vuex的可以先看一下 vuex官方文档,这里就不赘述了. 实现思路:假设我们现在想要访问自己在博客园里写的博客,这时候服务器需要知道当前用户是谁,才能确定我们是否有访问权限并正确地返回我们需要 ...
- RabbitMQ系列之【CentOS6.5安装RabbitMQ】
环境准备 操作系统:CentOS 6.5 Final RabbitMQ: 3.1.5 Python: 2.7.11 ErLang: R16B02 安装预环境(少什么安装什么) yum -y insta ...
- 【福利】FL Studio 20 汉化补丁包 _FL Studio 20 汉化包下载
我这两天在网上搜索FL Studio 20汉化包,找了半天也没有找到真正的汉化包,不过好在功夫不负有心人,让我找到了一个不错的FL Studio 20汉化网站,里面提供了FL Studio 20汉化包 ...
- Xor Sum(讲解异或)【字典树】
Xor Sum 题目链接(点击) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Other ...
- numpy中array数组对象的储存方式(n,1)和(n,)的区别
资料:https://stackoverflow.com/questions/22053050/difference-between-numpy-array-shape-r-1-and-r 这篇文章是 ...
- Linux下配置tomcat
我们可以在用户目录下新建一个tomcat目录 mkdir tomcat ls cd tomcat/ 使用wget命令下载tomcat的压缩包 wget https://downloads.apache ...