题目传送门

题目描述

Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris。他们告诉Chris的老师:“根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩《拳皇》游戏。现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话。”说完砰的一声把电话挂了。

Chris居住的城市由N个居住点和若干条连接居住点的双向街道组成,经过街道x需花费Tx分钟。可以保证,任两个居住点间有且仅有一条通路。Chris家在点C,Shermie和Yashiro分别住在点A和点B。Chris的老师和Chris的父母都有城市地图,但Chris的父母知道点A、B、C的具体位置而Chris的老师不知。

为了尽快找到Chris,Chris的父母会遵守以下两条规则:

  1. 如果A距离C比B距离C近,那么Chris的父母先去Shermie家寻找Chris,如果找不到,Chris的父母再去Yashiro家;反之亦然。
  2. Chris的父母总沿着两点间唯一的通路行走。

显然,Chris的老师知道Chris的父母在寻找Chris的过程中会遵守以上两条规则,但由于他并不知道A,B,C的具体位置,所以现在他希望你告诉他,最坏情况下Chris的父母要耗费多长时间才能找到Chris?

输入格式

输入文件第一行是两个整数N(3 ≤ N ≤ 200000)和M,分别表示居住点总数和街道总数。

以下M行,每行给出一条街道的信息。第i+1行包含整数Ui、Vi、Ti(1≤Ui, Vi ≤ N,1 ≤ Ti ≤ 1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟。街道信息不会重复给出。

输出格式

输出文件仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris。

输入输出样例

输入样例


输出样例

4

分析

我们要从点C出发先走到点A再走到点B(CA<CB) 或者是 从点C出发先走到点B再走到点A(CB<CA)

其实这两种情况是一样的,因为A、B的位置我们不确定,所以两点可以互换,所以我们把题目简化:

一句话题意:在一棵树上找三个点A、B、C使得AB+AC的值最大(满足AC<=BC)

这道题可以说是一个模板题,虽然题目中又是逃学又是找人,但实际上是让你求树的直径

AB的最大值很好想,显然就是树的直径,在一棵树中没有比直径更长的路程了

那么AC的最大值呢,我们可以在dfs求树的直径的时候顺便把每一个点到A、B的价值都求出来,在这两个价值中取较小值(因为要先到比较近的点)

最后再枚举一遍求最优决策(最大值),这实际上是一种贪心的思想

我们引用一下洛谷上的证明:传送门

最后要注意几个细节:

1、开long long,并且赋值为无穷大时要写8个3f:0x3f3f3f3f3f3f3f3f

2、双向边,开数组时一定要乘2

3、数组不能开得太大

这三个细节我每个都错了一遍

代码

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=;//数组不要开小了
typedef long long ll;//记得开long long
struct asd{
ll from,to,next,val;
}b[maxn];
ll n,m;
ll head[maxn],tot=;
void ad(ll aa,ll bb,ll cc){
b[tot].from=aa;
b[tot].to=bb;
b[tot].next=head[aa];
b[tot].val=cc;
head[aa]=tot++;
}//加边函数
ll dis[maxn],disA[maxn],disB[maxn],A,B;
//disA是每个点到端点A的距离,disB是,每个点到端点B的距离
//A、B为端点A、B的编号
ll zhijing,jl=-0x3f3f3f3f3f3f3f3f,id=;//定义直径
void dfs(ll now,ll fa){
for(ll i=head[now];i!=-;i=b[i].next){
ll u=b[i].to;
ll da=b[i].val;
if(u==fa) continue;
dis[u]=dis[now]+da;
if(dis[u]>jl){
jl=dis[u];
id=u;
}
dfs(u,now);
}
}//dfs求直径
int main() {
scanf("%lld%lld",&n,&m);
memset(head,-,sizeof(head));
for(ll i=;i<=m;i++){
ll aa,bb,cc;
scanf("%lld%lld%lld",&aa,&bb,&cc);
ad(aa,bb,cc);
ad(bb,aa,cc);
}
dfs(,);//第一遍dfs求A点标号
A=id;
memset(dis,,sizeof(dis));
id=,jl=-0x3f3f3f3f3f3f3f3f;
dfs(A,);//第二遍dfs求B点标号以及每一个点到A点的距离
B=id,zhijing=jl;
id=,jl=-0x3f3f3f3f3f3f3f3f;
for(ll i=;i<=n;i++){
disA[i]=dis[i];
}
memset(dis,,sizeof(dis));
dfs(B,);//第三遍dfs求每一个点到B点的距离,每次dfs之前不要忘了初始化
for(ll i=;i<=n;i++){
disB[i]=dis[i];
}
ll ans=-0x3f3f3f3f3f3f3f3f;
for(ll i=;i<=n;i++){
ans=max(ans,min(disA[i],disB[i]));
}//求最最优决策
printf("%lld\n",ans+zhijing);//输出
return ;
}

洛谷 P4408 [NOI2003]逃学的小孩的更多相关文章

  1. 洛谷 P4408 [NOI2003] 逃学的小孩 题解

    Analysis 题意虽然说先去谁家再去谁家,但是我们不需要管这个,因为AA.BB.CC三个点我们可以任意互相交换它们所代表的对象,所以题目要求的就是在一棵树上找到3个点AA.BB.CC令AB+BCA ...

  2. 洛谷P4408 [NOI2003] 逃学的小孩 (树的直径)

    本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离 ...

  3. LUOGU P4408 [NOI2003]逃学的小孩(树的直径)

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽 ...

  4. luogu P4408 [NOI2003]逃学的小孩

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心 ...

  5. 洛谷 P4408 逃学的小孩 解题报告

    P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...

  6. BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )

    树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...

  7. 【BZOJ1509】[NOI2003]逃学的小孩 直径

    [BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的 ...

  8. [NOI2003]逃学的小孩(树的直径)

    [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听 ...

  9. [NOI2003]逃学的小孩 题解

    前言 >原题传送门(洛谷)< 看了一下洛谷题面,这道NOI的题竟然是蓝的(恶评?),做了一下好像确实是蓝的... 解法 思路非常简单,找道树的直径,然后答案是直径长度加上最大的min(di ...

随机推荐

  1. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  2. 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用枚举?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于二方库依赖中接口返回值不允许使用枚举类型的规约,具体内容如下: 在谈论为什么之前先来科普下什么是二方库,二方库也称作二方包,一般指公司内 ...

  3. svn版本库的使用

    简单案例: 1.不管在哪个盘下(比如:C盘.D盘等),都先创建文件夹(这里我新建的文件夹是“项目”),创建好了就点击去,如下: 2.在自己新建的文件夹中再新建一个新的文件夹,如下: 3.选中你的文件夹 ...

  4. Hook踩坑记:React Hook react-unity-webgl

    自公司前后分离上手React以来,一个坑一个坑的踩,Class的全生命周期云里雾里,还么屡明白,就抱上了Hook的大腿不松手,确实爽到飞起.修改到Hook的过程基本比较顺畅,直接少了三分之一的代码,组 ...

  5. 源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 一个知识点的学习过程基本分为:运行helloworld ...

  6. qt-embedded-4.5.3移植到FL2440开发板

    1. 2.configure配置 ./configure -opensource -confirm-license -release -shared -fast -no-qt3support -no- ...

  7. 如何通过PR给视频添加字幕?

    第一步:将视频通过导出音频格式MP3 第二步:将音频MP3导入网易见外平台 第三步:在网易见外平台创建项目,进行语音转写如下所示: 第四步:将从网易见外平台到处的srt字母文件,打开后进行编码为utf ...

  8. Github上可以涨薪30k的Java教程和实战项目终于可以免费下载了

    写在前面 大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架.软件或者教程.这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整 ...

  9. (六)获取http状态码和处理返回结果

    int StatusCode = httpResponse.getStatusLine().getStatusCode(); 处理返回结果: /** * 处理返回结果 * @param respons ...

  10. mysql字符串类型(set类型)

    集合 set  不定想项选 类似于 enum枚举,在定义时,也需要指定其已有值! 与字符串相比,优势是: 1, 也是采用 整数进行管理的!采用位运算,从第一位开始为1,逐一x2! 2, 每个集合类型8 ...