蓝书(算法竞赛进阶指南)刷题记录——【SDOI2013】BZOJ3124 直径题解(树的直径)

HDU3534 Tree 求树的直径及其个数 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题目大意:给出一颗n个节点的树,每条边对应一个长度,求出距离最大的两个节点之间长度,并找出一共有多少个顶点对。 实现代码如下: /*求最长边的时候可以统计一下最长边的个数, 那么以u为根节点的子树中最长边为:Len[u]+max(len[v]), 个数node[u]*nod 阅读详情

题目:BZOJ3124.
题目大意:给定一棵 n n n个点的树,求这棵树的直径以及所有树直径都经过的边的数量.
1 ≤ n ≤ 2 ∗ 1 0 5 1\leq n\leq 2*10^5 1≤n≤2∗105.

首先第一问很好解决.

对于第二问,一棵树上所有直径必然有至少一个交点,并且所有直径的交必然是一条路径,考虑利用这个性质求解.

首先跑出一条路径具体的路径,考虑在这条路径上跑出一个区间作为答案.

考虑一个性质,设直径的两个端点为 x , y x,y x,y,那么对于一个点 k k k,若 x x x到 k k k的距离与以 k k k为一个端点不经过直径的最长链长度之和等于直径长度,那么显然 k k k到 y y y这一段上的所有边都不是必须边.

利用这个性质,我们就可以直接得到直径交的两个端点了.

时间复杂度 O ( n ) O(n) O(n).

代码如下:

#include<bits/stdc++.h>
using namespace std;
 
#define Abigail inline void
typedef long long LL;
 
const int N=200000;
const LL INF=(1LL<<60)-1;
 
int n;
struct side{
  int y,next,v;
}e[N*2+9];
int lin[N+9],cs;
 
void Ins(int x,int y,int v){e[++cs].y=y;e[cs].v=v;e[cs].next=lin[x];lin[x]=cs;}
void Ins2(int x,int y,int v){Ins(x,y,v);Ins(y,x,v);}
 
LL dp[N+9][2],ans0;
int pre[N+9][2];
 
void Update(int k,int id){
  LL v=dp[e[id].y][0]+e[id].v;
  if (v>dp[k][0]){
    dp[k][1]=dp[k][0];pre[k][1]=pre[k][0];
    dp[k][0]=v;pre[k][0]=id;
  }else if (v>dp[k][1]) dp[k][1]=v,pre[k][1]=id;
}
 
void Dfs_dp(int k,int fa){
  dp[k][0]=0;dp[k][1]=-INF;
  for (int i=lin[k];i;i=e[i].next)
    if (e[i].y^fa){
      Dfs_dp(e[i].y,k);
      Update(k,i);
    }
  ans0=max(ans0,dp[k][0]+dp[k][1]);
}
 
int dia[N+9],cd;
LL v[N+9];
 
void Get_dia(){
  Dfs_dp(1,0);
  int mx=1;
  for (int i=1;i<=n;++i)
    if (dp[i][0]+dp[i][1]>dp[mx][0]+dp[mx][1]) mx=i;
  int k=mx;
  for (;k;k=e[pre[k][0]].y) dia[++cd]=k,v[cd]=e[pre[k][0]].v;
  reverse(dia+1,dia+cd+1);
  reverse(v+1,v+cd+1);
  v[cd+1]=e[pre[mx][1]].v;
  for (k=e[pre[mx][1]].y;k;k=e[pre[k][0]].y) dia[++cd]=k,v[cd+1]=e[pre[k][0]].v;
}
 
LL dis[N+9];
int vis[N+9];
 
void Dfs_dis(int k,int id,LL vd){
  vis[k]=1;
  if (vd>dis[id]) dis[id]=vd;
  for (int i=lin[k];i;i=e[i].next)
    if (!vis[e[i].y]) Dfs_dis(e[i].y,id,vd+e[i].v);
}
 
void Get_dis(){
  for (int i=1;i<=cd;++i) vis[dia[i]]=1;
  for (int i=1;i<=cd;++i) Dfs_dis(dia[i],i,0);
}
 
int ans1;
 
void Get_ans1(){
  for (int i=1;i<=cd;++i) v[i]+=v[i-1];
  int l=cd,r=1;
  for (;r<=cd;++r)
    if (dis[r]+v[r]==ans0) break;
  for (;l>=1;--l)
    if (dis[l]+v[cd]-v[l]==ans0) break;
  ans1=r-l;
}
 
Abigail into(){
  scanf("%d",&n);
  for (int i=1;i<n;++i){
    int x,y,v;
    scanf("%d%d%d",&x,&y,&v);
    Ins2(x,y,v);
  }
}
 
Abigail work(){
  Get_dia();
  Get_dis();
  Get_ans1();
}
 
Abigail outo(){
  printf("%lld\n%d\n",ans0,ans1);
}

int main(){
  into();
  work();
  outo();
  return 0;
}
[bzoj 3124][sdoi 2013 省选] 直径 Description小Q最近学习了一些图论知识。根据课本,有如下定义。树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度。如果一棵树有N个节点,可以证明其有且仅有N-1 条边。 路径:一棵树上,任意两个节点之间最多有一条简单路径。我们用 dis(a,b) 表示点a和点b的路径上各边长度之和。称dis(a,b)为a、b两个节点间的距离。 直径:一棵树上,最长的路径为树的直径。树的直 阅读详情

相关推荐

Nvidia Tesla A100 驱动安装方法

Nvidia Tesla A100 驱动安装方法 遇到的问题:以前安装tesla系列、geforce系列等gpu 驱动的时候,只需执行nvidiaxxxx.run驱动包或者安装nvidiaxxxx.rpm包即可,但遇到新的GPU Nvidia Tesla A100的时候,安装完驱动似乎不起作用,找了半天资料,原来需要以下步骤才可以使用;

qq_24343177的博客 2万+

bzoj千题计划134:bzoj3124: [Sdoi2013]直径

http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1、dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问: 所有直径的交集一定是最长链上连续的一段 dfs3记录最长链, 从最长链上每个点i开始dfs4,记录能到达的非最长链点的最远距离mx 如果mx==最长链-dis[i],更新交集...

weixin_30925411的博客 170

自适应动态规划硕士博士论文学习

强化学习关注随机过程中的序贯决策问题,而自适应动态规划关注动态系统的控制问题。吸引域:系统渐近稳定的区域。

DarlingLSA的博客 1423

《算法竞赛·快冲300题》每日一题:“直径点对”

树形DP

罗勇军的博客 565

告别理论纠结!用ADS和Sigrity玩转电源完整性:从PDN阻抗优化到芯片供电仿真全流程

本文详细介绍了如何利用ADS和Sigrity工具进行电源完整性(PI)分析,从PDN阻抗优化到芯片供电仿真的全流程。通过频域、直流和时域分析,工程师可以精确评估电源网络性能,优化设计以避免电压波动和系统失效。文章还提供了ADS和Sigrity PowerDC的实战操作指南,帮助读者掌握现代PI设计的核心技术。

weixin_33749242的博客 310

一文读懂资管系统里的“清算路径”:钱和券的“导航地图”

简单来说,清算路径就是给每一笔交易预设好的“导航路线”。钱从哪个银行账户出?通过哪家证券公司去买?用哪个股东账户去登记?买回来的股票记在谁的名下?“清算路径”就是把这一连串问题的答案提前配置好。它连接了银行托管户(钱的源头)、券商(交易的中介)和交易所(买卖的市场)。没有配好这条路,交易就无法闭环。清算路径是金融基础设施的缩影。资金如何安全地从银行流向市场;资产如何合法地归属到产品名下;交易数据如何在不同系统间流转。它是资管系统能够日复一日、准确无误地处理亿万级交易的基石。

m0_37607945的博客 233

#bzoj2404#最长链(树的直径/树形DP)

2404: 最长链 时间限制: 1 Sec  内存限制: 128 MB 题目描述 给定一棵有n个节点的树,求每个节点到其他节点的最大距离 输入 输入第一行是一个自然数n(n≤10000), 接下来 (n−1) 行描述:  第i行包含两个自然数 , 表示编号为i的节点连接到的节点编号和这条网线的长度..距离总长不会超过10^9. 每行中的两个数字用空格隔开

ElaineZXY的博客 2161

手把手教你学Simulink——基于通信协议与标准的场景实例:卫星通信中的网络安全协议(IPSec)仿真

随着卫星通信在国防、金融、应急指挥、能源管网等关键领域的广泛应用,其安全性已成为系统设计的核心要求。然而,卫星链路具有广播特性、长距离传输、地面站分布广等特点,极易遭受窃听、篡改、重放、中间人攻击等网络威胁。传统的“信任链路层安全”已不足以应对现代网络攻击。为此,国际标准组织(如IETF、ETSI、CCSDS)推荐在卫星通信中部署协议,实现端到端的数据机密性、完整性、身份认证和抗重放保护。本文将手把手教你如何在中构建一个符合标准的仿真系统,涵盖从明文传输到加密隧道的完整安全链路建模。本文完整实现了。

MHD0815的博客 146

bzoj3124(树形dp)

求有多少条边:满足所有直径都经过该边。   两边树形dp,一遍以点做dp求出直径的个数,再以边做dp判断在直径上边的个数。   #include #include #include #include #include using namespace std; const int N=200005; const int inf=0x3f3f3f3f; typedef long long ll

zhhx2001的博客 549

用Verilog搭建PCIe控制器核心模块

PCIe控制器是硬件设计的核心模块,负责实现设备与主机之间的高速通信。本文将以Verilog语言为例,分步骤讲解如何从零构建一个简化的PCIe控制器核心模块,涵盖事务层(TLP)生成、数据链路层(DLLP)处理和物理层(PHY)接口适配。目标是为嵌入式开发者、FPGA工程师提供一个可扩展的硬件设计框架。​。

xiaoheshang_123的博客 279

600份国家自然基金申报书--模板

600份国家自然基金申报书--模板

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 4186

BZOJ 3124 [Sdoi2013]直径 DFS

BZOJ 3124 [Sdoi2013]直径 DFS

-Claude 1272

CKA-题库-简洁参考答案-反复练习20遍-必过!!!

新版CKA考试已于2020年9月1日正式上线! 考试模式:线上考试 考试时间:2小时 认证有效期:3年 软件版本:Kubernetes v1.19 重考政策:可接受1次重考 经验水平:中級 题目数量:17题 题库量小:随机的题目重复率极高 考试时可打开两个浏览器Tab,一个是考试窗口,一个用来查阅官方文档](https://kubernetes.io/docs/) 01 Task - 英文 Create a new ClusterRole named deployment-clusterrole tha.

随笔记录-分享&记忆 7315

bzoj3124

树形dp 先拎出来一条直径,然后看直径上挂着的每条链,如果等于左边就把左端点放过来,等于右端点就把右端点放过来 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N ...

weixin_30236595的博客 231

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

bzoj 3124 直径

很久没有写博客了。。中间有刷题哦!朕没有偷懒! ps看我博客的改版没有。。【朕也是会写那一点点HTML的人哈哈哈】这题损耗老朽身心无数。。。【【哀家不要打我】】题意很清晰喽。 第一问,求树的直径 – 这个可以 两边BFS。 第二问,求所有树的直径必须经过的边。分析: 观察 & 从 zxy 学长的博客中可以发现,任选一个点之后BFS最远距离的那个点。那个点必然是直径的一个端点。【【也可以用

mars_ch的博客 539

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

bzoj3124[Sdoi2013]直径(树dp)

Description 小Q最近学习了一些图论知识。根据课本,有如下定义。树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度。如果一棵树有N个节点,可以证明其有且仅有N-1 条边。 路径:一棵树上,任意两个节点之间最多有一条简单路径。我们用 dis(a,b) 表示点a和点b的路径上各边长度之和。称dis(a,b)为a、b两个节点间的距离。 直径:一棵树上,最长的路径

Anonymity的博客 735

BZOJ 3124: [Sdoi2013]直径 (随便写写就好了)

bfs

NeighThorn的博客 845

[bzoj3124][乱搞]直径

Description 小Q最近学习了一些图论知识。根据课本,有如下定义。树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度。如果一棵树有N个节点,可以证明其有且仅有N-1 条边。 路径:一棵树上,任意两个节点之间最多有一条简单路径。我们用 dis(a,b) 表示点a和点b的路径上各边长度之和。称dis(a,b)为a、b两个节点间的距离。 直径:一棵树上,最长的...

Rose_max的博客 528

[BZOJ3124][Sdoi2013]直径(树形dp)

弱者报复,强者宽恕,智者不在乎。

zyf2000 1195

【BZOJ3124】【SDOI2013】直径 题解

题面:传送门 &nbsp;&nbsp;&nbsp;&nbsp;这题思路还是蛮好想的,直径大家应该都会球吧?关键是怎么球直径必须经过的那几条边呢?其实也很简单。 &nbsp;&nbsp;&nbsp;&nbsp;我们先任意求出一条直径,那么每条直径必须经过的边肯定也在这条直径上,可是为什么有些边不一定出现在所有直径上呢?原因是直径分叉了,那我们只要找到向上分叉的最低点和向下分叉的最高点,它们之...

蒟 585

bzoj3124 [Sdoi2013]直径 树的直径

问题 I: [Sdoi2013]直径 时间限制: 1 Sec 内存限制: 256 MB 题目描述 小Q最近学习了一些图论知识。根据课本,有如下定义。树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度。如果一棵树有N个节点,可以证明其有且仅有N-1 条边。 路径:一棵树上,任意两个节点之间最多有一条简单路径。我们用 dis(a,b) 表示点a和点b的路径上各边长度之和。称dis(a

蒟蒻QTY 1167

BZOJ3124: [Sdoi2013]直径

题意清晰明恋简单易懂… 误打误撞分析出来了一个性质:组成答案的边的集合一定是连续的一条链且没有分叉,根据这个性质我们可以设计一个算法。 先找出来随意一条树的直径,对于树的直径上的每个点求一条不经过这条直径的最长链。 大概是这个样子的,然后我们取最中间的一段输出即可。 (ps:数据特别特别特别水…怎么写都能过的样子?(雾))#include<queue> #include<cstdio>

MirrorGray的博客 1204

BZOJ3124 [sdoi2013]直径(树上的dfs)

树上的DFS 【题解】 1. 给你一棵树,求树的直径:    先随便取一个点,一遍dfs找到离它最远的点low,再以low为起点做一遍dfs,找到离low最远的点high    那么low到high的距离即为直径(反证法可以证明)     2. 求出有多少条边在这棵树的所有直径上:    两个结论:    1)首先,这些边一定在同一条直径上(因为它们在任意一条直径上)  

cjk_My steps 2469

bzoj3124 [Sdoi2013]直径 直径+树形dp

这个题标签为什么会有网络流。。 首先树的直径求法就是两遍dfs 然后以其中一个为树的根,统计子树到节点的最长距离与次长距离: 符合条件的点一定是最长距离唯一的,且次长距离与到根的距离不相等 注: 1、同级语句的顺序 2、long long 码: #include #include #include using namespace std; #define N

-----PSI----- 378

CH1809匹配统计【KMP】

1809 匹配统计0x18「基本数据结构」练习 描述 阿轩在纸上写了两个字符串,分别记为A和B。利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度。 不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x。 例如...

weixin_30765475的博客 230
上一篇: 蓝书(算法竞赛进阶指南)刷题记录——BZOJ1999 树网的核(树的直径)
下一篇: 树的直径相关
hezlik
博客等级 码龄9年 111粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值