[BZOJ1131/POI2008]Sta树的深度
Description
给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大
Input
给出一个数字N,代表有N个点.N<=1000000 下面N-1条边.
Output
输出你所找到的点,如果具有多个解,请输出编号最小的那个.
Sample Input
8
1 4
5 6
4 5
6 7
6 8
2 4
3 4
Sample Output
7
题解:
都说是裸树形DP,其实我做的时候就是把它当成搜索去做了,当然是一个意思。假设当前的根为1,先求出每棵子树的大小,以及所有点的深度之和。考虑到我们换根会带来的影响,一部分点的深度会减小,一部分点的深度会增加。故假设我们当前在第i号节点,递归到他的一个儿子节点j,则总深度的变化为以第i号节点所有儿子节点的子树的节点和减去剩余的节点和。故把所有节点的情况都考虑一次,最后求出最大值就行了。
但是,有一个很坑的地方,如果你是用的Windows,用DFS基本上是没有戏了,因为节点数量很多,在Windows环境下不能开启无限栈,所以还是用BFS吧,当然你也可以手写栈,但是没必要作死。
代码(本地非官方数据83分,用的DFS):
--------------------------------------------------------------------------------------------------
#include <cstdio>
#define MAXN 1000005
int max(int a, int b) { return a > b ? a : b; }
struct Edge { int v, next; } edge[MAXN << 1];
int n, u, v, tot[MAXN], now, h[MAXN];
int fa[MAXN], siz[MAXN], ans, maxt;
void addEdge(int u, int v) { now++, edge[now] = (Edge) {v, h[u]}, h[u] = now; }
void DFS(int o)
{
siz[o] = 1;
for (int x = h[o]; x; x = edge[x].next)
{
int v = edge[x].v;
if (v != fa[o]) fa[v] = o, DFS(v), siz[o] += siz[v], tot[o] += tot[v] + siz[o];
}
}
void DFS2(int o)
{
if (o != 1) tot[o] = tot[fa[o]] - siz[o] * 2 + n;
for (int x = h[o]; x; x = edge[x].next)
{
int v = edge[x].v;
if (v != fa[o]) DFS2(v);
}
}
int main()
{
freopen("sta.in", "r", stdin);
freopen("sta.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n - 1; i++)
scanf("%d %d", &u, &v), addEdge(u, v), addEdge(v, u);
DFS(1), DFS2(1);
for (int i = 1; i <= n; i++)
if (maxt < tot[i]) maxt = tot[i], ans = i;
printf("%d", ans);
}
--------------------------------------------------------------------------------------------------
[BZOJ1131/POI2008]Sta树的深度的更多相关文章
- [BZOJ1131][POI2008] Sta 树的深度
Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...
- BZOJ1131 POI2008 Sta 【树形DP】
BZOJ1131 POI2008 Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=10 ...
- STA树的深度(树型DP)
STA树的深度 题目大意 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Outpu ...
- BZOJ1131 [POI2008]Sta 其他
原文链接http://www.cnblogs.com/zhouzhendong/p/8081100.html 题目传送门 - BZOJ1131 题意概括 给出一个N个点的树,找出一个点来,以这个点为根 ...
- BZOJ1131[POI2008]Sta——树形DP
题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...
- bzoj千题计划151:bzoj1131: [POI2008]Sta
http://www.lydsy.com/JudgeOnline/problem.php?id=1131 dp[i]=dp[fa[i]]-son[i]+n-son[i] #include<cst ...
- bzoj1131: [POI2008]Sta
思路:首先先求出以1为根的答案,然后考虑由i转移到i的儿子的答案的变化,显然以son[i]为根的子树的所有结点的深度都会减一,其余的点的深度都会加一,然后就可以直接O(n)求出所有结点的答案,然后取m ...
- [bzoj1131][POI2008]Sta_树形dp
Sta bzoj-1131 POI-2008 题目大意:给定一棵n个点的树,求一个根,使得深度和最大. 注释:$1\le n \le 10^6$. 想法:扭一扭即可. 扭的时候看看这个点当没当过根. ...
- 【BZOJ-1131】Sta 树形DP
1131: [POI2008]Sta Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1150 Solved: 378[Submit][Status] ...
随机推荐
- hdu1159Common Subsequence(动态规划)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- ConfigHelpers
--默认值可以不传 local ConfigHelpers = {} --设置物体高亮 target:设置对象 isLigth:是否高亮 seeThrough:是否穿透(默认为true,穿透) sta ...
- ADO.NET基础学习-----四种模型,防止SQL注入
1.ExcuteNonQuery 执行非查询语句,返回受影响的行数. // 1.ExcuteNonQuery string sqlconn = "Data Source=wss;Initia ...
- 了解Python控制流语句——if语句
控制流 截止到现在,在我们所看过的程序中,总是有一系列语句从上到下精确排列,并交由 Python 忠实地执行.如果你想改变这一工作流程,应该怎么做?就像这样的情况:你需要程序作出一些决定,并依据不同的 ...
- vista x64 vs2010 win32添加资源 未能完成操作解决办法
非常痛苦的感觉,不能用vc6,msdn library也不好用,去2k3系统试了下,没有任何问题,无奈想重装系统了,但是太浪费时间,装了虚拟机也是vistax64的,安装之后正常... 卸载重新安装依 ...
- python常用命令—‘\r’
# \r 默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容 如常用的显示程序完成进度!!
- Python3 Tkinter-Message
1.创建 from tkinter import * root=Tk() Message(root,text='hello Message').pack() root.mainloop() 2.属性 ...
- nodejs笔记--基础篇(一)
Sublime Node.js开发环境配置 下载并安装Node.js安装包后再开始配置 1.先安装好Sublime Text 2 2.运行Sublime,菜单上找到Tools ---> Buil ...
- 微信小程序学习:开发注意点
11月2日更新: 微信小程序支持内嵌网页,新增 <web-view /> 组件调试支持: 传送门 <!-- wxml --> <!-- 指向微信公众平台首页的web-vi ...
- php分页类的实现与调用 (自我摘记)
page.class.php <?php namespace Component; class Page { private $total; //数据表中总记录数 private $listRo ...