【树形dp】 bzoj1131 Sta
题目
给出一个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
分析
这个题还是比较简单的,如果数据小的话,那么挨个枚举应该是没什么大问题,但是这个题数据就很大,所以单纯的一个个顶点来枚举显然是不可能实现的。所以我们应该找一下每个点之间的关系,但是总体来说就是一个深搜的思想。
我们来想象一下,一棵树,一开始给你一个根,这个根只有一颗子树,然后我们向下依次推,每次更改根节点,那么上一个根节点及其子树的深度都是要-1的,而现在这个节点的子树深度是+1的,所以根据这个,我们可以进行一下简化。
然后我们就可以把每个点的“上"边的深度加上”下“边的深度进行比较,然后得出最后的结果。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6+;
#define ll long long int n,head[maxn],cnt=;
struct Node{
int from,to,next;
}e[maxn<<];
ll si[maxn],d[maxn],u[maxn],fa[maxn]; void Add(int from,int to){
e[cnt].from=from;
e[cnt].to=to;
e[cnt].next=head[from];
head[from]=cnt++;
} void Dfs1(int now,int fu){//普通的深搜,找出深度。
fa[now]=fu;
si[now]=;
for(int i=head[now];i;i=e[i].next){
int to=e[i].to;
if(to == fu)continue;
Dfs1(to,now);
si[now]+=si[to];
d[now]+=d[to]+si[to];
}
} void Dfs2(int now){//找到以这个点为根时“父树”的全部深度
if(now!=)
u[now]=u[fa[now]]+d[fa[now]]-d[now]-*si[now]+n;
for(int i=head[now];i;i=e[i].next){
int to=e[i].to;
if(to==fa[now])continue;
Dfs2(to);
}
} int main(){
scanf("%d",&n);
for(int i=;i<n;++i){
int x,y;
scanf("%d%d",&x,&y);
Add(x,y);
Add(y,x);
}
Dfs1(,);
Dfs2();
ll ans = ;
int sum;
for(int i=;i<=n;++i){
if(u[i]+d[i]>ans){//一个个的评判,最终得出结果
ans=u[i]+d[i];
sum = i;
}
}
printf("%d\n",sum);
}
【树形dp】 bzoj1131 Sta的更多相关文章
- 【BZOJ-1131】Sta 树形DP
1131: [POI2008]Sta Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1150 Solved: 378[Submit][Status] ...
- 【bzoj1131】[POI2008]Sta 树形dp
题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...
- [POI2008]Sta(树形dp)
[POI2008]Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面 ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- HDU-4661 Message Passing 树形DP,排列组合
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4661 题意:有n个人呈树状结构,每个人知道一个独特的消息.每次可以让一个人将他所知的所有消息告诉和他相 ...
- BNUOJ-26482 Juice 树形DP
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26482 题意:给一颗树,根节点为送电站,可以无穷送电,其它节点为house,电量达到pi时 ...
- HDU-4679 Terrorist’s destroy 树形DP,维护
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w ...
- HDU-4616 Game 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 比较典型的树形DP题目,f[u][j][k]表示以点u为子树,经过 j 个陷阱的最大值,其中k= ...
- [SHOI2008]仙人掌图 II——树形dp与环形处理
题意: 给定一个仙人掌,边权为1 距离定义为两个点之间的最短路径 直径定义为距离最远的两个点的距离 求仙人掌直径 题解: 类比树形dp求直径. f[i]表示i向下最多多长 处理链的话,直接dp即可. ...
- UVa 10859 - Placing Lampposts 树形DP 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
随机推荐
- Java实现 LeetCode 757 设置交集大小至少为2(排序+滑动窗口)
757. 设置交集大小至少为2 一个整数区间 [a, b] ( a < b ) 代表着从 a 到 b 的所有连续整数,包括 a 和 b. 给你一组整数区间intervals,请找到一个最小的集合 ...
- Java实现 LeetCode 508 出现次数最多的子树元素和
508. 出现次数最多的子树元素和 给出二叉树的根,找出出现次数最多的子树元素和.一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身).然后求出出现次数最多的子树元素和. ...
- java中装箱和拆箱的详细使用(详解)
一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Jav ...
- Linux 用户管理命令-usermod和chage
usermod和useradd命令的使用相类似,useradd针对的是新创建的用户可以修改他的信息,usermod则可以修改已经存在的用户的信息,选项也基本相同 usermod [选项] 用户名 -L ...
- webpack从单页面到多页面
前言 从上次更完webpack从什么都不懂到入门之后,好久没有更新过文章了,可能是因为自己懒了吧.今天看了下自己的索引量少了一半o(╥﹏╥)o,发现事态严重,赶紧更新一篇23333 也是因为最近踩了一 ...
- mysql8.0 Mac下的安装
一.下载及安装 首先去官网下载mac对应版本的Mysql,尾缀为.dmg的程序包 下载地址:https://dev.mysql.com/downloads/mysql/ 二.启动 在 Setting ...
- Jquery封装: WebSocket插件
1 $(function() { var websocket = null; //浏览器是否支持websocket if ("WebSocket" in window) { try ...
- <VCC笔记> Assumption
接下来是第二种注释语句类型Assumption.语法_(Assume E), 这个表达式是让VCC在接下来的额推理中,无视表达式E, 直接认可表达式E. 例: int x, y; _(assume x ...
- FastStone+ImageReady+Kutools plus导入图片到Excel单元格
先前打算自己做一个也附带训练下,发现有下面方法也好. 1)做帮助文档时需要一种格式(需要将图片导入到Excel中时,假如是按此法归类汇总) 2)FastStone滚动截图 粘贴到Photo ...
- C++值元编程
--永远不要在OJ上使用值元编程,过于简单的没有优势,能有优势的编译错误. 背景 2019年10月,我在学习算法.有一道作业题,输入规模很小,可以用打表法解决.具体方案有以下三种: 运行时预处理,生成 ...