luogu P3304 [SDOI2013]直径
树的直径两遍dfs救星了
至于一定在直径中的边数,可以发现这些边一定是连续的(不然你两条直径中间能有空挡?),然后,如果某个点往下有多条直径,那么这条点以下都不算入答案.所以以直径分别两端点为根,找出这样离根最近的点(注意最远的点就是另一个端点),然后找到那两个点的距离就是答案
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=200000+10;
il LL rd()
{
re LL x=0,w=1;re char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N<<1],nt[N<<1],hd[N],tot=1;
LL w[N<<1],di[N],f[N],lent;
bool v[N];
il void add(int x,int y,LL z)
{
++tot;to[tot]=y;nt[tot]=hd[x];w[tot]=z;hd[x]=tot;
++tot;to[tot]=x;nt[tot]=hd[y];w[tot]=z;hd[y]=tot;
}
int n,fa[N];
il int dfs(int x,int ffa)
{
int xx=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
fa[y]=x,di[y]=di[x]+w[i];
int yy=dfs(y,x);
if(di[xx]<di[yy]) xx=yy;
}
return xx?xx:x;
}
il int dd(int x,int ffa)
{
f[x]=0;
int xx=0,cnt=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
int yy=dd(y,x);
if(!xx) xx=yy;
f[x]=max(f[x],f[y]+w[i]);
if(di[x]+f[y]+w[i]==lent&&ffa) ++cnt;
}
return (cnt>1&&v[x])?x:xx;
}
int main()
{
int aa,bb,c,d,an=0;
n=rd();
for(int i=1;i<n;i++)
{
int x=rd(),y=rd(),z=rd();
add(x,y,z);
}
aa=1;
di[1]=fa[1]=0;aa=dfs(1,0);
di[aa]=fa[aa]=0;bb=dfs(aa,0);
lent=di[bb];
int now=bb;
while(now) v[now]=true,now=fa[now];
c=dd(aa,0);if(!c) c=bb;
di[bb]=fa[bb]=0,dfs(bb,0);
d=dd(bb,0);if(!d) d=aa;
while(d!=c) ++an,d=fa[d];
printf("%lld\n%d\n",lent,an);
return 0;
}
luogu P3304 [SDOI2013]直径的更多相关文章
- [洛谷P3304] [SDOI2013]直径
洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...
- bzoj3124: [Sdoi2013]直径 树形dp two points
题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...
- bzoj千题计划134:bzoj3124: [Sdoi2013]直径
http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...
- 3124: [Sdoi2013]直径
3124: [Sdoi2013]直径 https://www.lydsy.com/JudgeOnline/problem.php?id=3124 分析: 所有直径都经过的边,一定都是连续的一段.(画个 ...
- luogu P3305 [SDOI2013]费用流
题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...
- 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)
[BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...
- BZOJ_3124_[Sdoi2013]直径_树形DP
BZOJ_3124_[Sdoi2013]直径_树形DP Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵 ...
- Bzoj 3124: [Sdoi2013]直径 题解
3124: [Sdoi2013]直径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1222 Solved: 580[Submit][Status] ...
- 【洛谷 P3304】[SDOI2013]直径(树的直径)
题目链接 题意,求一棵树被所有直径经过的边的条数. 这题是我们8.25KS图论的最后一题,当时我果断打了暴力求所有直径然后树上差分统计的方法,好像有点小问题,boom0了. 考完改这题,改了好久,各种 ...
随机推荐
- Java之静态代码块
有一些情况下,有些代码需要在项目启动的时候就执行,则需要使用静态代码块,这种代码是主动执行的.Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次.如果static代码块有多个,JV ...
- MT【204】离散型最值
(联赛一试2006,14).将2006表示成5个正整数$x_1,x_2,x_3,x_4,x_5$之和.记$S=\sum\limits_{1\le i<j\le5}{x_ix_j}$问:(1) 当 ...
- 自学Aruba5.2-Aruba安全认证-有PEFNG 许可证环境的角色策略管理
点击返回:自学Aruba之路 自学Aruba5.2-Aruba安全认证- 有PEFNG 许可证环境的角色策略管理 导入许可后,可以对Role进行配置: 1. 系统自带的Role的可以修改的属性: 2. ...
- 自学Zabbix5.1 zabbix maintenance维护周期
自学Zabbix5.1 zabbix maintenance维护周期 1. 概述 你可以定义维护周期在主机或主机组里.这里有2种维护状态: 依旧收集数据 继续对目标的监控数据的收集 暂停收集数据 ...
- 自学Zabbix13.1 分布式监控proxy介绍
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix13.1 分布式监控proxy介绍 zabbix2.4版本之前,zabbix提供了 ...
- 洛谷 P2466 Sue的小球 解题报告
P2466 [SDOI2008]Sue的小球 题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当 ...
- bower介绍
一. bower是什么? bower是twitter推出的第三方依赖管理工具.其特点是对包结构没有强制规范,也因此bower本身并不提供一套构建工具,它充当的基本上是一个静态资源的共享平台.它可用于搜 ...
- [NOI2009]二叉查找树
题目大意: 给定一棵严格的treap,父亲节点的优先级必然小于儿子节点的.权值按照二叉树的定义,左儿子小于父亲小于右儿子. 深度从1开始定义,每个点除优先级.数值之外,还有一个访问频度. 访问频度所产 ...
- 粉红色界面的vscode,程序媛的必备利器
vscode都是黑漆漆的界面,对于一个喜欢花花草草的程序媛来说,长时间对着这样的界面,简直是一种折磨啊 有的时候,也会不自觉的想要看看一些粉色的东西,毕竟有着单纯的少女心 今天看到了一篇博客,作者是自 ...
- office 激活教程
首先在我的百度云里下载:http://pan.baidu.com/share/link?shareid=2200272243&uk=1985086665激活工具安装包 如果遇到问题,可以加我Q ...