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 条边. 路径:一 ...
随机推荐
- 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化
前言 我的服务器带宽比较高,博客部署在上面访问的时候几乎没感觉有加载延迟,就没做图片这块的优化,不过最近有小伙伴说博客的图片加载比较慢,那就来把图片优化完善一下吧~ 目前有两个地方需要完善 图片瀑布流 ...
- 数电第7周周结_by_yc
一.通用双向移位寄存器: 功能描述: 4位的双向移位寄存器,含控制输入端(ctrl).串行输入端(Dsl.Dsr).4个并行输入端和4个并行输出端,要求实现5种功能:异步置零.同步置数.左移.右移 ...
- 1.1 大数据简介-hadoop-最全最完整的保姆级的java大数据学习资料
目录 1 hadoop-最全最完整的保姆级的java大数据学习资料 1.1 大数据简介 1.1.1 大数据的定义 1.1.2 大数据的特点 1.1.3 大数据的应用场景 1.1.4 大数据的发展趋势及 ...
- 【每日一题】【遍历orSet】2022年2月1日-NC66 两个链表的第一个公共结点
描述输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 输入描述:输入分为是3段,第 ...
- 【JUC】信号量Semaphore详解
欢迎关注专栏[JAVA并发] 欢迎关注个人公众号-- JAVA旭阳 前言 大家应该都用过synchronized 关键字加锁,用来保证某个时刻只允许一个线程运行.那么如果控制某个时刻允许指定数量的线程 ...
- 使用selenium爬取淘宝
一.出现的问题 前段时间在使用selenium对淘宝进行模拟登陆的时候,输入完正好和密码,然后验证码无论如何都不能划过去.找了好久,原来是因为selenium在浏览器中运 行的时候会暴露 ...
- django中如何开启事务
一:django中如何开启事务 1.事务的四大特征 ACID A: 原子性 每个事务都是不可分割的最小单位(同一个事物内的多个操作要么同时成功要么同时失败) C: 一致性 事物必须是使数据库从一个一致 ...
- 基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序
前言 上一篇留的坑,火速补上. 在之前的第6篇中,已经有初步介绍,本文做一些补充,已经搞定这部分的同学可以快速跳过,基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列 ...
- 比Sqoop功能更加强大开源数据同步工具DataX实战
@ 目录 概述 定义 与Sqoop对比 框架设计 支持插件 核心架构 核心优势 部署 基础环境 安装 从stream读取数据并打印到控制台 读取MySQL写入HDFS 读取HDFS写入MySQL 执行 ...
- 13、IDEA 提取代码块成独立方法 Extract Method
两种方式:1.IDEA快捷键: Ctrl + Alt + M 2.选中整块代码 –> 点击右键 –> Refactor –> Extract –>Method