2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)
传送门
一道sbsbsb树形dpdpdp
第一问直接求树的直径。
考虑第二问问的边肯定在同一条直径上均是连续的。
因此我们将直径记下来。
然后对于直径上的每一个点,dpdpdp出以这个点为根的子树中不走与直径上的节点能得到的最大深度来求出那一段合法边的范围。
那么有些什么情况呢?

- 分出了一条跟这个点下面那段直径一样长的那么满足条件的区域最下端不能低于这个点。

- 分出了一条跟这个点上面那段直径一样长的那么满足条件的区域最上端不能高于这个点。
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
const int N=2e5+5;
int n,cnt=0,first[N],bg=0,ed=0,fa[N],line[N],tot=0,down=-0x3f3f3f3f,up=0x3f3f3f3f;
bool vis[N];
ll dis[N],Dis[N];
struct edge{int v,next;ll w;}e[N<<1];
inline void add(int u,int v,ll w){e[++cnt].v=v,e[cnt].w=w,e[cnt].next=first[u],first[u]=cnt;}
void dfs1(int p,int pre){
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==pre)continue;
dis[v]=dis[p]+e[i].w,dfs1(v,p);
}
if(dis[p]>dis[bg])bg=p;
}
void dfs2(int p){
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==fa[p])continue;
fa[v]=p,dis[v]=dis[p]+e[i].w,dfs2(v);
}
if(dis[p]>dis[ed])ed=p;
}
void dfs3(int p,int pre){
Dis[p]=dis[p];
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==pre||vis[v])continue;
dfs3(v,p),Dis[p]=max(Dis[p],Dis[v]);
}
}
int main(){
n=read();
for(int i=1,u,v,w;i<n;++i)u=read(),v=read(),w=read(),add(u,v,(ll)w),add(v,u,(ll)w);
dfs1(1,0),dis[bg]=0,dfs2(bg);
for(int i=ed;i;i=fa[i])vis[line[++tot]=i]=1;
for(int i=1;i<=tot;++i){
dfs3(line[i],0);
if(Dis[line[i]]==dis[line[1]])down=max(down,i);
if(Dis[line[i]]==dis[line[i]]*2)up=min(up,i);
}
cout<<dis[ed]<<'\n'<<up-down;
return 0;
}
2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)的更多相关文章
- bzoj3124: [Sdoi2013]直径 树形dp two points
题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...
- BZOJ3124: [Sdoi2013]直径 (树形DP)
题意:给一颗树 第一问求直径 第二问求有多少条边是所有直径都含有的 题解:求直径就不说了 解第二问需要自己摸索出一些性质 任意记录一条直径后 跑这条直径的每一个点 如果以这个点不经过直径能到达最远的 ...
- 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)
[BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...
- [SDOI2013] 直径 - 树形dp
对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
- 2014 Super Training #9 E Destroy --树的直径+树形DP
原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...
- 2018.09.06 警卫安排(树形dp)
描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:有边直接相连的宫殿可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全 ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
- Codeforces 633F 树的直径/树形DP
题意:有两个小孩玩游戏,每个小孩可以选择一个起始点,并且下一个选择的点必须和自己选择的上一个点相邻,问两个选的点权和的最大值是多少? 思路:首先这个问题可以转化为求树上两不相交路径的点权和的最大值,对 ...
随机推荐
- xcode 更新svn/Git后发现模拟器显示No Scheme问题
这个是由于XXX..xcodeproj包中xcuserdata文件夹中user.xcuserdatad文件夹名字的问题...user.xcuserdatad文件夹的名字,不是当前用户的名字,就会显示n ...
- 项目打包 TestFlight用法
TestFlight用法 包教包会(iOS APP官方测试工具) https://www.jianshu.com/p/4be185e4069c
- Mybatis常用标签使用
trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix:可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖, ...
- Linux磁盘挂载详述
1.查看硬盘信息及分区 一般使用”fdisk -l”命令可以列出系统中当前连接的硬盘,设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息. [root@localhost home]# fdis ...
- MVC中Ajax post 和Ajax Get——提交对象
HTTP 请求:GET vs. POST两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST.GET - 从指定的资源请求数据POST - 向指定的资源提交要处理的数据GET 基本上 ...
- Split Array into Consecutive Subsequences
659. Split Array into Consecutive Subsequences You are given an integer array sorted in ascending or ...
- sqlserver数据库的物理存储格式和逻辑存储格式
物理存储结构: 数据库文件在磁盘上的存储形式: 主数据文件:*.mdf.用来存储数据库的启动信息.存储部分或全部的数据.整个的数据库只能有一个主数据文件 辅助数据文件:*.ndf.用于存储主数据文件未 ...
- Python while for if....else
1函数input()的工作原理: 函数input()让程序暂停运行,等待用户输入一些文本.获取用户输入后,python将其存储在一个变量(即要向用户显示的提示或说明) raw_input 是Py ...
- PAT 1043 输出PATest(20)(代码+思路)
1043 输出PATest(20)(20 分) 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按"PATestPATest...."这样的顺序输出 ...
- java8 数据结构的改变(一)
在JDK1.6,JDK1.7中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当数组中一个位置上的元素较多,即hash值相等的元素较多时,通过key ...