Bzoj 1131[POI2008]STA-Station (树形DP)
Bzoj 1131[POI2008]STA-Station (树形DP)
状态:
设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移.
发现儿子的深度及其自己的深度\(-1\)
其余的\(+1\),记录一下\(size\)就ok了
转移:
\(f[i] = f[fa] + n - 2 * size[i]\)
记忆化搜索即可.
Bzoj 可能过不了,原因貌似是栈空间不足,可以去洛谷提交,我这里的解决方法是.记忆化搜索的时候用\(n\)作为开头.然后就过了.
#include <iostream>
#include <cstdio>
#define ll long long
const int maxN = 1000000 + 7;
ll f[maxN],n; // f[i] = f[fa] + n - 2 * size[i];
int size[maxN],dep[maxN],fa[maxN];
struct Node {
int v,nex;
}Map[maxN << 1];
int head[maxN],num;
inline int read() {
int x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9') {if(c == '-')f = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
return x * f;
}
inline ll max(ll a,ll b) {return a > b ? a : b;}
void add_Node(int u,int v) {
Map[++ num] = (Node) {v,head[u]};
head[u] = num;
return ;
}
void work_fst(int now) {
size[now] = 1;dep[now] = dep[fa[now]] + 1;
for(int i = head[now];i;i = Map[i].nex) {
int v = Map[i].v;
if(v != fa[now]) {
fa[v] = now;
work_fst(v);
size[now] += size[v];
}
}
return ;
}
void work_dp(int now) {
for(int i = head[now];i;i = Map[i].nex) {
int v = Map[i].v;
if(v != fa[now]) {
f[v] = f[now] + n - 2 * size[v];
work_dp(v);
}
}
}
int main() {
n = read();
for(int i = 1,u,v;i < n;++ i) {
u = read();v = read();
add_Node(u,v);
add_Node(v,u);
}
dep[0] = -1;
work_fst(n);
for(int i = 1;i <= n;++ i)
f[n] += dep[i];
work_dp(n);
ll ans = 0;
for(int i = 1;i <= n;++ i)
ans = max(ans,f[i]);
for(int i = 1;i <= n;++ i)
if(f[i] == ans) {printf("%d\n", i);break;}
return 0;
}
Bzoj 1131[POI2008]STA-Station (树形DP)的更多相关文章
- BZOJ 1131 [POI2008]Sta(树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1131 [题目大意] 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度 ...
- 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 ...
- [POI2008]Sta(树形dp)
[POI2008]Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面 ...
- BZOJ 1131: [POI2008]Sta
Description 一棵树,问以那个节点为根时根的总和最大. Sol DFS+树形DP. 第一遍统计一下 size 和 d. 第二遍转移根,统计答案就行了. Code /************* ...
- BZOJ1131 POI2008 Sta 【树形DP】
BZOJ1131 POI2008 Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=10 ...
- 1131: [POI2008]Sta
1131: [POI2008]Sta Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 783 Solved: 235[Submit][Status] ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
随机推荐
- left join on 和where条件的放置(转)
http://blog.csdn.net/muxiaoshan/article/details/7617533
- 洛谷 P3931 SAC E#1 - 一道难题 Tree
题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索. 她设置了一棵树( ...
- 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter
中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter 中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStar ...
- E. Karen and Supermarket
E. Karen and Supermarket time limit per test 2 seconds memory limit per test 512 megabytes input sta ...
- 用Node+wechaty写一个爬虫脚本每天定时给女(男)朋友发微信暖心话
wechatBot 微信每日说,每日自动发送微信消息给你心爱的人 项目介绍 灵感来源 在掘金看到了一篇<用Node + EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件>后, 在评论区偶然 ...
- Vue Scroller:Vue 下拉刷新及无限加载组件
Vue Scroller Vue Scroller is a foundational component ofVonic UI. In purpose of smooth scrolling, pu ...
- Kendo MVVM 数据绑定(十) Source
Kendo MVVM 数据绑定(十) Source Source 绑定可以把 ViewModel 的值和由 Kendo 模板定义的目标元素绑定,如果 ViewModel 的值发生变化,被绑定的目标元素 ...
- web常见几种处理图标方法
方法一: 用background制作小图标 像这样,拿到设计稿后把所有的图标放在一张图片上,利用background-position.width.height来控制图标的位置及大小. 代码: .ic ...
- 工作方法-scrum+番茄工作法
1.产品和开发团队近期的工作分析和安排,使用scrum. 产品的工作:通过product backlog来列出 开发团队近期的工作安排:通过sprint backlog来列出,由个人认领,并估算(优先 ...
- allure使用简介
#安装依赖包pip install requests_toolbeltpip install pyyamlpip install pytest-allure-adaptor #安装allure2 说明 ...