JZOJ 3213. 【SDOI2013】直径
题目


思路
树的直径很好求,两遍 \(dfs\),记下两个端点
然后很显然所有直径经过的边必然在我们求出的这条直线上
那么我们只要判断一下一条直径上的边是不是答案
假设当前边为 \(i\)
那么把 \(i\) 割去后原树变成了两棵不联通的树
我们只要看这两棵子树分别的直径和不和原树的直径相等
如果至少有一条相等,那么说明原树中有一条直径可以不经过 \(i\)
故这种 \(i\) 不是答案
那么我们对直径一端到另一端的边依次判断即可
如何快速求分开后子树的直径?
我们可以 \(dfs\) 出分别以直径两端为根的每个节点的最长链,次长链以及本节点子树中的直径
转移就很好办了
\(Code\)
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 2e5 + 5;
int n , h[N] , tot , p , q , pre[N];
LL dis , f1[N] , f2[N] , f3[N] , g1[N] , g2[N] , g3[N] , s , ss;
struct edge{
int to , nxt , w;
}e[N << 1];
inline void add(int x , int y , int z)
{
e[++tot] = (edge){y , h[x] , z};
h[x] = tot;
}
inline void dfs(int x , int fa , LL d)
{
if (d > dis) dis = d , q = x;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
dfs(v , x , d + e[i].w);
}
}
inline void dfs1(int x , int fa , LL d)
{
pre[x] = fa;
if (d > dis) dis = d , q = x;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
dfs1(v , x , d + e[i].w);
if (f1[v] + e[i].w > f1[x]) f2[x] = f1[x] , f1[x] = f1[v] + e[i].w;
else if (f1[v] + e[i].w > f2[x]) f2[x] = f1[v] + e[i].w;
f3[x] = max(f3[x] , f3[v]);
}
f3[x] = max(f3[x] , f1[x] + f2[x]);
}
inline void dfs2(int x , int fa)
{
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
dfs2(v , x);
if (g1[v] + e[i].w > g1[x]) g2[x] = g1[x] , g1[x] = g1[v] + e[i].w;
else if (g1[v] + e[i].w > g2[x]) g2[x] = g1[v] + e[i].w;
g3[x] = max(g3[x] , g3[v]);
}
g3[x] = max(g3[x] , g1[x] + g2[x]);
}
inline void work()
{
dis = 0;
dfs(1 , 0 , 0);
p = q;
dis = 0;
dfs1(p , 0 , 0);
dfs2(q , 0);
for(register int i = q; i != p; i = pre[i])
{
s++;
if (f3[i] == dis || g3[pre[i]] == dis) ss++;
}
printf("%lld\n%lld" , dis , s - ss);
}
int main()
{
scanf("%d" , &n);
int u , v , w;
for(register int i = 1; i < n; i++)
{
scanf("%d%d%d" , &u , &v , &w);
add(u , v , w) , add(v , u , w);
}
work();
}
JZOJ 3213. 【SDOI2013】直径的更多相关文章
- 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距离最长链左端点的距离 第二问 ...
- [洛谷P3304] [SDOI2013]直径
洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...
- 3124: [Sdoi2013]直径
3124: [Sdoi2013]直径 https://www.lydsy.com/JudgeOnline/problem.php?id=3124 分析: 所有直径都经过的边,一定都是连续的一段.(画个 ...
- 【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] ...
- 【bzoj3124】 Sdoi2013—直径
http://www.lydsy.com/JudgeOnline/problem.php?id=3124 (题目链接) 题意 求树的直径以及直径的交. Solution 我的想法超麻烦,经供参考..思 ...
- bzoj 3124: [Sdoi2013]直径
#include<cstdio> #include<iostream> #define M 400009 #define ll long long using namespac ...
- bzoj 3124 [Sdoi2013]直径(dfs)
Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一 ...
随机推荐
- ArcGIS 通过字段计算 设置顺序编码
地块编号="前缀" & left("0000",4-len( [FID]+1)) & ([FID] +1)
- Linux和shell面试内容
一.Linux 1.列出5个常用高级命令 ps -ef ps -aux df -h top io top xargs tail uptime netstat 2.查看磁盘使用情况.查看进程.查看端口号 ...
- Elasticsearch提示low disk watermark [85%] exceeded on [UTyrLH40Q9uIzHzX-yMFXg][Sonofelice][/Users/baid...
mac本地启动es之后发现运行一段时间一分钟就能打印好几条info日志: [2018-03-13T10:15:42,497][INFO ][o.e.c.r.a.DiskThresholdMonitor ...
- .Net执行SQL/存储过程之易用轻量工具
支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. 由于该工具近来被广东省数个公司2B项目采用,且表现稳定,得到良好验证 ...
- [常用工具] Python视频处理库VidGear使用指北
VidGear是一个高性能的Python视频处理库,它在预载多个专业视频图像处理库的基础上,如OpenCV.FFmpeg.ZeroMQ.picamera.starlette.yt_dlp.pyscre ...
- 使用java代码调用rabbitmq接口进行新增编辑mq用户、虚拟机vhost、动态创建交换机exchange、队列queue以及设置权限,绑定vhost与exchange等操作
使用java代码操作rabbitmq时,首先需要一个有创建用户等权限的管理员账号,需要在rabbitmq的后台管理页面手动创建这个账号,系统推荐的这几个tag可以让账号有rabbitmq后台管理页面的 ...
- python之路47 django路由层配置 虚拟环境
可视化界面之数据增删改查 针对数据对象主键字段的获取可以使用更加方便的obj.pk获取 在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看 ''' form表单中能够触发提交动作 ...
- UnoCSS 简化 CSS 的书写,Nice!
CSS 样式太多,重复写 在学习 UnoCSS 之前,我提出几个问题: 你是否有过写完了 HTML 之后,跳转到 style 写 CSS 这样来回跳转的痛苦? 你是否有过不知道如何给节点取类名的痛苦( ...
- 都用过@Autowired,但你知道它是怎么实现的吗
前言 在使用Spring开发的时候,配置的方式主要有两种,一种是xml的方式,另外一种是 java config的方式.在使用的过程中java config,我们难免会与注解进行各种打交道,其中,我们 ...
- 【学习笔记】Tarjan 图论算法
- 前言 本文主要介绍 Tarjan 算法的「强连通分量」「割点」「桥」等算法. 争取写的好懂一些. - 「强连通分量」 - 何为「强连通分量」 在有向图中,如果任意两个点都能通过直接或间接的路径相互 ...