洛谷 P4408 [NOI2003]逃学的小孩
题目描述
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的父母会遵守以下两条规则:
- 如果A距离C比B距离C近,那么Chris的父母先去Shermie家寻找Chris,如果找不到,Chris的父母再去Yashiro家;反之亦然。
- 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]逃学的小孩的更多相关文章
- 洛谷 P4408 [NOI2003] 逃学的小孩 题解
Analysis 题意虽然说先去谁家再去谁家,但是我们不需要管这个,因为AA.BB.CC三个点我们可以任意互相交换它们所代表的对象,所以题目要求的就是在一棵树上找到3个点AA.BB.CC令AB+BCA ...
- 洛谷P4408 [NOI2003] 逃学的小孩 (树的直径)
本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离 ...
- LUOGU P4408 [NOI2003]逃学的小孩(树的直径)
题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽 ...
- luogu P4408 [NOI2003]逃学的小孩
题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心 ...
- 洛谷 P4408 逃学的小孩 解题报告
P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...
- BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )
树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...
- 【BZOJ1509】[NOI2003]逃学的小孩 直径
[BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3 N 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的 ...
- [NOI2003]逃学的小孩(树的直径)
[NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听 ...
- [NOI2003]逃学的小孩 题解
前言 >原题传送门(洛谷)< 看了一下洛谷题面,这道NOI的题竟然是蓝的(恶评?),做了一下好像确实是蓝的... 解法 思路非常简单,找道树的直径,然后答案是直径长度加上最大的min(di ...
随机推荐
- 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)
作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...
- Python--字典(三级菜单)
# -*- coding:utf-8 -*- data = { "腾讯":{ "LOL":{ "上单":["诺手",&q ...
- nacos基础--客户端下载
对于nacos的作用,我在这里不在过多介绍,不知道的同学可以自行先了解,对于nacos,有官网进行介绍,对于一个初学者来说是一件非常方便的事情. 官网地址:https://nacos.io 但是在下载 ...
- LR字符串处理函数-lr_save_var
int lr_save_var ("截取的字符串"+start,len,options,param_name) start:表示从第几位截取 len:表示截取长度 option ...
- Maven和Gradle如何添加依赖
仓库地址:https://mvnrepository.com
- 一个简单的Shell脚本(解决windows上文本在macos上乱码问题)
之所以有这一篇文章,是因为之前我写过的一篇文章:“解决Mac上打开txt文件乱码问题”:传送门: https://www.cnblogs.com/chester-cs/p/11784079.html ...
- umi 调试
最近在umi. 设置一个layout字段, 结果左边菜单栏就出现了. 很神奇. 决定对这个库一探究竟. 我是一个喜欢看底层库的人,网上所有的启动方式都是yarn或者npm start 启动服务.然后 ...
- 9.实战交付一套dubbo微服务到k8s集群(2)之Jenkins部署
1.下载Jenkins镜像打包上传harbor上 [root@hdss7- ~]# docker pull jenkins/jenkins:2.190. [root@hdss7- ~]# docker ...
- C语言副本机制
1.除了数组外,其他都有副本机制(包括结构体数组) 2.结构体作为参数具有副本机制,结构体返回值也有副本机制 . 3.函数的参数和返回值都有他的副本机制. #include<stdio.h> ...
- 在执行jar包时如何使用调优参数
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 使用时去掉换行 ...