[NOI2003]逃学的小孩【观察+树的直径】
Online Judge:Bzoj1509,Luogu P4408
Label:观察,树的直径
题目描述

输入
第一行是两个整数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。
样例
Input
4 3
1 2 1
2 3 1
3 4 1
Output
4
题解
【大致题意】
在树上选三个点,设家在A,现在要去B,然后再从B到C。请你求出最大的总路程\(AB+BC\),且满足\(AB<AC\)。
假设现在已经确定了路径\(BC\),该如何去找最优的\(A\)?预处理两个数组\(g[i][0/1]\)分别表示点i到端点\(B/C\)的距离,则有\(ans=dis(BC)+max(min(g[i][0],g[i][1]))\)\(i∈[1,n]\)。
回想一个性质,树上离某点i最远的点一定是树直径上两个端点中的一个。根据上面的式子,很明显令\(BC\)为树的直径时答案一定最优。接下来再按上面的方法去找个\(A\)就解决了。
时间复杂度为\(O(N)\)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
struct node{int to,w;};
vector<node>e[N];
int id1,id2,n,m;
ll ma=0,g[N][2];
void dfs(int x,ll dis,int fa){
if(dis>ma)ma=dis,id1=x;
for(int i=0;i<e[x].size();i++){
int y=e[x][i].to;if(y==fa)continue;
dfs(y,dis+e[x][i].w,x);
}
}
void go(int x,ll dis,int fa,int o){
g[x][o]=dis;
for(int i=0;i<e[x].size();i++){
int y=e[x][i].to;if(y==fa)continue;
go(y,dis+e[x][i].w,x,o);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1,u,v,d;i<=m;i++){
scanf("%d%d%d",&u,&v,&d);
e[u].push_back((node){v,d});
e[v].push_back((node){u,d});
}
dfs(1,0,0);
id2=id1,ma=0;
dfs(id1,0,0);
go(id1,0,0,0);go(id2,0,0,1);
ll now=0;
for(int i=1;i<=n;i++){
if(i==id1||i==id2)continue;
now=max(now,min(g[i][0],g[i][1]));
}
printf("%lld\n",now+ma);
}
[NOI2003]逃学的小孩【观察+树的直径】的更多相关文章
- [NOI2003]逃学的小孩(树的直径)
[NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听 ...
- LUOGU P4408 [NOI2003]逃学的小孩(树的直径)
题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽 ...
- 洛谷P4408 [NOI2003] 逃学的小孩 (树的直径)
本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离 ...
- Luogu4408 [NOI2003]逃学的小孩 (树的直径)
一边一定是直径,另一边从两端点走取最小值的最大值 #include <iostream> #include <cstdio> #include <cstring> ...
- NOI 2003 逃学的小孩 (树的直径)
[NOI2003 逃学的小孩] 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一 ...
- 【BZOJ1509】[NOI2003]逃学的小孩 直径
[BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3 N 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的 ...
- BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )
树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...
- BZOJ1509: [NOI2003]逃学的小孩(树的直径)
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1126 Solved: 567[Submit][Status][Discuss] Description ...
- [NOI2003]逃学的小孩 (贪心+树的直径+暴力枚举)
Input 第一行是两个整数N(3 <= N <= 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1<=Ui ...
随机推荐
- 关于TMDS
https://en.wikipedia.org/wiki/Transition-minimized_differential_signaling TMDS,Transition Minimized ...
- 关于Async与Await的FAQ
=============C#.Net 篇目录============== 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰 ...
- SPSS数据编辑器界面 度量 名义 序号 标签
SPSS数据编辑器界面 度量 名义 序号 标签 变量视图:变量视图用于管理变量的属性,包括变量名称,类型,标签,缺失值,度量标准等属性. 数据视图:数据视图用于管理录入的数据,一行表示一条记录在不同变 ...
- Django rest framework (视图类详解)
官网:https://www.django-rest-framework.org/api-guide/viewsets/ 在django rest framework 视图中一共有N个类 第一类:AP ...
- neo4j算法(1)-介绍
neo4j为图数据库,其中涉及的也就为图算法,图算法被用来度量图形,节点及关系. 在neo4j中,通过call algo.list() 可查看neo4j中的算法列表. 在neo4j官方文档中,主要记录 ...
- shell脚本练习01
######################################################################### # File Name: 4.5.sh # Auth ...
- linux 2.6 内核的移植
内核移植过程 下载 linux 内核 从 http://www.kernel.org/pub/linux/kernel/v2.6/linux2.6.14.1.tar.bz2 下载 linux2 ...
- uoj51 元旦三侠的游戏
题意:询问a,b,n.每次可以a+1或b+1,保证a^b<=n,不能操作者输.问先手是否赢? n<=1e9. 标程: #include<cstdio> #include< ...
- Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】
Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...
- Spring 框架中Http请求处理流程
Spring Web http request请求流程: 首先介绍这边你需要知道的继承体系,DispacherServlet继承自FrameworkServlet,FrameworkServlet继承 ...