【题解】AcWing 389. 直径
题目描述
共两个问题,第一问求树的直径长度,第二问求直径的必须边
思路
第一问很好求,lyd书里有,就不再赘述。
这里建议使用两次bfs的方法,因为关系到第二问的路径,这么做比较方便。
然后考虑第二问。
(注:必须边就是每条直径都要经过的一部分边)
容易知道,所有必须边构成一条链(有待证明)(其实是懒得想2333)
假设现在已经求得了一条直径的具体路径。设其两端分别为x和y。
从一端枚举到另外一端,并用l和r维护相交的部分。
先看x到y的。
设当前的节点为u。如果(u和x的距离)==(u不过直径能达到的最大长度),
说明u这里是直径的分叉口,\(l=u\)
再看y到x的。
同样的道理,若(u和y的距离)==(u不过直径的最大长度),\(r=u\)
这样就确定了 l 和 r,完成!
(ps:记得开long long哦)
C++ 代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
int n,tot=0,head[N],rt1,rt2,q[N],h,t,fro[N],hh[N];
bool vis[N];ll dis[N];
struct edge
{
int ver,nxt;
ll w;
}e[N*2];
void mmax( ll &x,ll y )
{
if ( y>x ) x=y;
}
void bfs( int st )
{
memset( vis,0,sizeof(vis) );
dis[st]=0; vis[st]=1; h=1; t=0; q[++t]=st;
while ( h<=t )
{
int x=q[h++];
for ( int i=head[x]; i; i=e[i].nxt )
{
int to=e[i].ver;
if ( vis[to] ) continue;
dis[to]=dis[x]+e[i].w; vis[to]=1; fro[to]=x;
q[++t]=to;
}
}
}
ll dfs( int x,int fa )
{
if ( fa!=0 && vis[x] ) return 0;
ll s=0;
for ( int i=head[x]; i; i=e[i].nxt )
{
int to=e[i].ver;
if ( to==fa || vis[to] ) continue;
mmax( s,dfs( to,x )+e[i].w );
}
return s;
}
void add( int u,int v,ll w )
{
tot++; e[tot].nxt=head[u]; e[tot].w=w; e[tot].ver=v; head[u]=tot;
}
int main()
{
scanf( "%d",&n );
for ( int i=1,x,y,l; i<n; i++ )
{
scanf( "%d%d%d",&x,&y,&l );
add( x,y,l ); add( y,x,l );
}
ll s=0; int x,l,r;
bfs( 1 );
for ( int i=1; i<=n; i++ )
if ( s<dis[i] ) s=dis[i],rt1=i;
bfs( rt1 ); s=0;
for ( int i=1; i<=n; i++ )
if ( s<dis[i] ) s=dis[i],rt2=i;
memset( vis,0,sizeof(vis) );
x=rt2; vis[rt1]=1;
while ( x!=rt1 )
{
vis[x]=1; hh[fro[x]]=hh[x]+1; x=fro[x];
}
l=rt2; r=rt1; x=rt2;
while ( x!=rt1 )
{
s=dfs( x,0 );
if ( s==dis[rt2]-dis[x] ) l=x;
if ( s==dis[x] )
{
r=x; break;
}
x=fro[x];
}
printf( "%lld\n%d",dis[rt2],hh[r]-hh[l] );
}
运行总时间:455ms 空间:15456 KB
完结撒花qwq
update
我找到证明了qwq
夏日大佬的一句话完结。
“显然直径的必须边一定连续,不然就成环了”
夏日大佬tql orz
其实还有一种更为优美的做法。这里空间很大,我就写一下吧(
可以发现,直径的公共部分,一定是连在一起的。那么可以在第一问的时候求出直径长度,并把所有直径上的边权减一,然后再求一次直径,两次的差就是答案。
原因显然。
【题解】AcWing 389. 直径的更多相关文章
- REHの收藏列表
搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...
- bzoj3124: [Sdoi2013]直径 树形dp two points
题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...
- 【loj6038】「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
题目描述 给你 $n$ 个点,支持 $m$ 次操作,每次为以下两种:连一条边,保证连完后是一棵树/森林:询问一个点能到达的最远的点与该点的距离.强制在线. $n\le 3\times 10^5$ ,$ ...
- 一些noip模拟题一句话题解
Problem A: 序列 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 12 Solved: 9[Submit][Status][Web Boar ...
- 【bzoj2870】最长道路tree 树的直径+并查集
题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每 ...
- 【bzoj1999】[Noip2007]Core树网的核 树的直径+双指针法+单调队列
题目描述 给出一棵树,定义一个点到一条路径的距离为这个点到这条路径上所有点的距离的最小值.求一条长度不超过s的路径,使得所有点到这条路径的距离的最大值最小. 输入 包含n行: 第1行,两个正整数n和s ...
- AcWing 91. 最短Hamilton路径
今天第一次在\(AcWing\)这个网站上做题,来发一下此网站的第一篇题解 传送门 思路 直接枚举的话时间复杂度为\(O(n*n!)\) 复杂度显然爆炸,所以我们用二进制枚举,这样就可以把复杂度降到\ ...
- (acwing蓝桥杯c++AB组)1.2 递推
1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...
- 2014 牡丹江区域赛 B D I
http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=358 The 2014 ACM-ICPC Asia Mudanj ...
随机推荐
- centos7单独编译nbd内核模块
前言 centos7默认内核没有带nbd的模块,可以通过下载跟当前版本匹配的内核源码,编译源码指定的模块,然后加载到系统 步骤 判断版本 [root@lab201 linux-3.10.0-957.e ...
- linux利用screen进行shell下的屏幕协作
我们都知道linux是支持多终端并行处理的 但是某些时候我们可能有比较特殊的需求需要两个人同时处理一个终端,screen 正好能满足这个要求 首先需要安装screen软件: debian和ubuntu ...
- win10安装MySQL5.7.31 zip版
因为我之前卸载了安装的(msi,exe)格式的MySQL,现在重新安装zip版的MySQL. 1,下载MySQL MySQL下载地址 : https://dev.mysql.com/downloads ...
- JS逆向课程笔记
扩展知识 Sources-js代码格式化
- 【老孟Flutter】自定义文本步进组件
交流 老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com 欢迎加入Flutter交流群(微信:laomengit).关注公众号[老孟Flutter] ...
- FL Studio中如何制作和混音警报声
警报声在当今的许多电影配乐中,或者电子音乐的环境fx中经常出现.为了使用这种尖刺的警示声音,我们除了自己录制已有的警报声以外,也可以使用FL Studio20中的合成器和混音插件来制作属于自己的警报声 ...
- CorelDRAW“出血线”的精准预设与辅助线便捷操作
CorelDRAW软件是一款常用的制图工具,非常适合用于印刷品输出,各种印刷图文制作都依赖于它.所以,我们设计者每次用CorelDRAW制图的一个关键就是要做好"标尺辅助线"设置, ...
- cocoslua3.17 android机器上播放音效不全
开发过程中遇到一个问题,一个8秒的音效,在android机器上播放不完就结束了:网上说是由于android播放音效的内存限制的:原因知道了,那怎么解决呢? 通过各种搜索查找发现还是解决不了问题,然后自 ...
- 小知识点 之 JVM -XX:MaxGCPauseMillis 与 -XX:GCTimeRatio
写在前边 JVM调优更多是针对不同应用类型及目标进行的调整,往往有很大的实验成份,通过实验来针对当前应用设置相对合适的参数,提高应用程序的性能与稳定性 最近在复习JVM,Parallel Scaven ...
- [BUGCASE]Webpack打包报JavaScript堆内存泄漏的错误
一.问题描述 执行npm run build之后报错: 报错信息: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript he ...