树的深度———树形DP
题目描述
输入
输出
样例
样例输入
样例输出
7
分析
这道题数据有1000000,把每一个顶点都枚举一次显然不现实,肯定会T掉
所以,我们还是从图中找规律
按照习惯,我们先把1号节点作为根节点模拟一下
我们可以很容易的通过一次dfs求出1号节点作为根节点时树的深度之和
1+2*3+3+4*2=18(当然,你把根节点的深度置为1也不会影响结果)
那么我们把根节点向下移到4好节点,我们可以发现什么呢
这时同把1作为根节点相比,1号节点的深度增加了1,但4所在的子树的节点的深度都减小了1
同样地,我们再把根节点下移到5,这时同把4作为根节点相比,1、4、3、2号节点的深度增加了1,但5所在的子树的节点的深度都减小了1
所以,我们设ans[i]为以i作为根节点时树的度数之和,siz[i]为以i为根子树的大小
那么ans[i]=ans[fa]+n-siz[i]-siz[i]=ans[fa]+n-2*siz[i]
siz数组我们可以预处理得到,ans[fa]我们也可以由ans[1]求得,所以,这道题就迎刃而解了
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=;
typedef long long ll;
struct asd{
ll from,to,next;
}b[maxn];
ll head[maxn],tot=,n;
void ad(ll aa,ll bb){
b[tot].from=aa;
b[tot].to=bb;
b[tot].next=head[aa];
head[aa]=tot++;
}
ll dep[maxn],ans[maxn],siz[maxn];
void dfs(ll now,ll fa){
dep[now]=dep[fa]+;
siz[now ]=;
ans[now]=dep[now];
for(ll i=head[now];i!=-;i=b[i].next){
ll u=b[i].to;
if(u==fa) continue;
dfs(u,now);
siz[now]+=siz[u];
ans[now]+=ans[u];
}
}
void dfs2(ll now,ll fa){
for(ll i=head[now];i!=-;i=b[i].next){
ll u=b[i].to;
if(u==fa) continue;
if(u!=){
ans[u]=ans[now]+(n-siz[u])-siz[u];
}
dfs2(u,now);
}
}
int main(){
memset(head,-,sizeof(head));
scanf("%lld",&n);
for(ll i=;i<n;i++){
ll aa,bb;
scanf("%lld%lld",&aa,&bb);
ad(aa,bb);
ad(bb,aa);
}
dep[]=-;//也可以置为0,都可以
dfs(,);
dfs2(,);
ll tot=-,jll=;
for(ll i=;i<=n;i++){
if(ans[i]>tot){
tot=ans[i];
jll=i;
}
}
printf("%lld\n",jll);
return ;
}
树的深度———树形DP的更多相关文章
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- 2014 Super Training #9 E Destroy --树的直径+树形DP
原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...
- (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。
Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...
- bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]
4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- POJ 1655 BalanceAct 3107 Godfather (树的重心)(树形DP)
参考网址:http://blog.csdn.net/acdreamers/article/details/16905653 树的重心的定义: 树的重心也叫树的质心.找到一个点,其所有的子树中最大的 ...
- Codeforces 633F 树的直径/树形DP
题意:有两个小孩玩游戏,每个小孩可以选择一个起始点,并且下一个选择的点必须和自己选择的上一个点相邻,问两个选的点权和的最大值是多少? 思路:首先这个问题可以转化为求树上两不相交路径的点权和的最大值,对 ...
随机推荐
- Windows10开启Ubuntu子系统并搭建Docker环境
前言 很早就听说微软有个基于Ubuntu的子系统,一直也没机会尝试一下,之前也只是用VMware安装,但是还要单独安装软件,安装镜像,一点都不fit,所以就瞎折腾下(也是因为最近有空). 搭建Ubun ...
- linux基础相关命令
请参照以下文章 shell常用命令:https://www.cnblogs.com/pengtangtang/articles/PengTangTang_linux_base_one.html 通配符 ...
- Java基础(十)
一.XML概述 属性文件是用来描述程序配置,属性文件包含了一组名/值对.属性文件采用的是一种单一的平面层次结构,同时属性文件要求键是唯一的. XML格式能够表达层次结构,并且重复的元素不会被曲解. H ...
- windows下Python版本切换使用方法
由于历史原因,Python有两个大的版本分支,Python2和Python3,又由于一些库只支持某个版本分支,所以需要在电脑上同时安装Python2和Python3,因此如何让两个版本的Python兼 ...
- 伪造随机的User-Agent
写好爬虫的原则只有一条: 就是让你的抓取行为和用户访问网站的真实行为尽量一致 1.伪造UA字符串,每次请求都使用随机生成的UA 为了减少复杂度,随机生成UA的功能通过第三方模块库fake-userag ...
- @Results用法总结
MyBatis中使用@Results注解来映射查询结果集到实体类属性. (1)@Results的基本用法.当数据库字段名与实体类对应的属性名不一致时,可以使用@Results映射来将其对应起来.col ...
- JATG引脚定义
JTAG各类接口针脚定义.含义以及SWD接线方式 2018年08月10日 16:04:14 kkwant 阅读数 1165 标签: 接口定义tag 原文地址为:JTAG各类接口针脚定义.含义以及S ...
- pdb--Python调试器
使用python编写程序,必然会遇见bug,而pdb就是python语言的一个好的debugger. 下面介绍pdb的使用方式 1. 单步执行代码,通过命令 python -m pdb xxx.py ...
- js银行卡四个数字一个空格
!function () { document.getElementById('bankCard').onkeyup = function (event) { var v = this.value; ...
- 如何解决jeecgBoot前端运行项目之后无法获取验证码的问题
我也是第一次接触这个开源项目,拿到项目之后,安装完环境和依赖,当我启动项目的时候,验证码却刷新不出来. 然后公司后端告诉我需要改两个接口,一个是public目录下的index.html和vue.con ...