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 条边. 路径:一 ...
随机推荐
- mongorestore target dump invalid CreateFile dump The system cannot find
问题 使用 mongorestore 指定 dump 文件夹,恢复数据报错. mongorestore target 'dump' invalid: CreateFile dump: The syst ...
- 关于Wegame页面空白的问题解决
前言 前几天帮亲戚家装电脑系统,装好后发现 wegame 所有页面都不能正确加载(全部是空白页面),很神奇,在网上找了很多种解决办法都没有效果,后来不过细心的我发现360浏览器一直提示我证书不安全过期 ...
- 使用VMware安装Linux(CentOS)操作系统
使用VMware安装CentOS 6.4 环境:Windows7 , VMware Workstation10, CentOS6.4 为什么选择CentOS ? 主流: 目前的Linux操作系统主要应 ...
- 利用python数据分析
利用python进行数据分析 本书由Python pandas项目创始人Wes McKinney亲笔撰写,详细介绍利用Python进行操作.处理.清洗和规整数据等方面的具体细节和基本要点.第2版针对P ...
- TIE: A Framework for Embedding-based Incremental Temporal Knowledge Graph Completion 增量时序知识图谱补全论文解读
论文网址:https://dl.acm.org/doi/10.1145/3404835.3462961 论文提出一种用增量学习思想做时序知识图谱补全(Temporal Knowledge Graph ...
- AssertionError: Class XXXXX missing "Meta.model" attribute
源码示例: from rest_framework import serializers from set.models import Set class SetSerializers(seriali ...
- 分享一个项目中在用的图片处理工具类(图片缩放,旋转,画布格式,字节,image,bitmap转换等)
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Dra ...
- [python] CairoSVG使用教程
1 CairoSVG介绍 代码下载地址 CairoSVG是一个将SVG1.1转为PNG,PDF, PS格式的转化.SVG算目前火热的图像文件格式了,它的英文全称为Scalable Vector Gra ...
- 学习ASP.NET Core Blazor编程系列二十——文件上传(完)
学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...
- 《深度探索C++对象模型》第三章 Data语意学
首先给出以下例子: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public ...