博客
关于我
【最短路】P4408 [NOI2003]逃学的小孩
阅读量:281 次
发布时间:2019-03-03

本文共 1462 字,大约阅读时间需要 4 分钟。

对于一张图上的任意三个点A,B,C 求max(min(dis[A][C],dis[B][C])+dis[A][B])

我们先确定A,B为树上直径,可以用反证法简单证一下

然后就可以对于A和B两个点算一下其他点到A/B的距离,然后枚举点C即可

 

代码

#include
using namespace std;const int maxn=200000+5;int n,m,tot,st,ed;int head[maxn];long long dis1[maxn],dis2[maxn];struct edge{ int to,nxt; long long v;}e[maxn<<1];void add(int x,int y,long long z){ e[++tot].nxt=head[x]; head[x]=tot; e[tot].to=y; e[tot].v=z;}void dfs1(int x,int fa){ for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; int v=e[i].v; if(to==fa) continue; dis1[to]=dis1[x]+v; if(dis1[to]>dis1[st]) st=to; dfs1(to,x); }}void dfs2(int x,int fa){ for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; int v=e[i].v; if(to==fa) continue; dis2[to]=dis2[x]+v; if(dis2[to]>dis2[ed]) ed=to; dfs2(to,x); }}void dfss1(int x,int fa){ for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; int v=e[i].v; if(to==fa) continue; dis1[to]=dis1[x]+v; dfss1(to,x); }}void dfss2(int x,int fa){ for(int i=head[x];i;i=e[i].nxt) { int to=e[i].to; int v=e[i].v; if(to==fa) continue; dis2[to]=dis2[x]+v; dfss2(to,x); }}int main(){ scanf("%d%d",&n,&m); int x,y; long long z; for(int i=1;i<=m;i++) { scanf("%d%d%lld",&x,&y,&z); add(x,y,z); add(y,x,z); } dfs1(1,0); dfs2(st,0); long long tmp=dis2[ed]; memset(dis1,0,sizeof(dis1)); memset(dis2,0,sizeof(dis2)); dfss1(st,0); dfss2(ed,0); long long ans=0; for(int i=1;i<=n;i++) { if(i==st || i==ed) continue; ans=max(ans,min(dis1[i],dis2[i])); } printf("%lld",ans+tmp); return 0;}

 

转载地址:http://xcwm.baihongyu.com/

你可能感兴趣的文章
花1亿扶持优质红人,如涵推动网红经济出圈之路有何深意?
查看>>
抢滩抖音、B站,快手港股IPO进程加速
查看>>
智能穿戴的结局依然充满悬念
查看>>
Linux中的虚拟内存机制和内存映射
查看>>
Android系统启动系列5 SystemServer进程下
查看>>
Android四大组件系列9 ContentProvider原理
查看>>
理解PendingIntent
查看>>
Android SurfaceFlinger4 提交Buffer
查看>>
深入理解 ClientLifecycleManager 机制
查看>>
android基础知识回顾--ContentProvider简单用法
查看>>
压缩解压
查看>>
js try{}catch(){}finally{}语句
查看>>
ES6 函数模块(四)
查看>>
基于遗传算法(deap)的配词问题与deap框架
查看>>
JavaScript入门
查看>>
PAT (Basic Level) Practice (中文)——1005 继续(3n+1)猜想 (25分)
查看>>
PAT (Basic Level) Practice (中文)——1011 A+B 和 C (15分)
查看>>
vivos7和荣耀x10哪个好 vivos7和荣耀x10区别评测
查看>>
i711700K和r55600x差距大不大 i7 11700K和r5 5600x对比哪个好
查看>>
R3 PRO 3200G和r7 3700u 哪个好
查看>>