[NOI2003]逃学的小孩 题解】的更多相关文章

https://www.lydsy.com/JudgeOnline/problem.php?id=1509 https://www.luogu.org/problemnew/show/P4408 sb题,但是我至今不知道为什么这张图就一定是棵树……这题意没说明白啊…… 显然求直径,再求一点使得该点到直径两端的点的距离的最小值最大. 没有什么好方法,最后一个点只能暴力,所以我们预处理两端点到每个点的dis即可. 于是我们两遍bfs求直径,顺道就给做了就行. (然后我不会bfs求直径,我只会dp求……
Analysis 题意虽然说先去谁家再去谁家,但是我们不需要管这个,因为AA.BB.CC三个点我们可以任意互相交换它们所代表的对象,所以题目要求的就是在一棵树上找到3个点AA.BB.CC令AB+BCAB+BC最大,同时要满足AC>ABAC>AB. 由于这是一棵树,它满足非常可爱的性质,就是如果找一个点出去两条路径使它们的合最大,那么一条是直径时一定会存在一种最大的方案. 所以我们可以使要找的两条路径其中一条是直径(设为ABAB),然后枚举剩下的点,找到一个到达直径端点最长的另一条路径,不过因为…
前言 >原题传送门(洛谷)< 看了一下洛谷题面,这道NOI的题竟然是蓝的(恶评?),做了一下好像确实是蓝的... 解法 思路非常简单,找道树的直径,然后答案是直径长度加上最大的min(dis[pos1], dis[pos2]),pos1和pos2是指定的任意一条直径的两个端点,dis是距离 证明 鉴于这是一棵树(原题面:可以保证,任两个居住点间有且仅有一条通路.) 因此,我们最大的方案必然包含一条直径 可以稍加思考,如果不是直径的话一定能找到一种取直径的方法比它更大... 那么再任意找另一个点…
[BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1Ui, Vi  N,1  Ti  1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟.街道信息不会重复给出. Output 仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris. Sample…
[NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:"根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话."说完砰的一…
树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... --------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype>   usin…
这一题不会做啊…… 我觉得真要比赛的话我可能会随机上几万次,然后再用LCA求距离,更新最优值,等到快超时的时候输出答案…… 题解请看2007年陈瑜希论文 代码: ; type node=record w,go,next:longint; end; ..maxn] of node; f:..maxn,..] of int64; first,u:..maxn] of longint; i,x,y,z,n,tot,m:longint; ans:int64; function max(x,y:int64…
题意:给一棵树 选三个点A,B,C 求A到B的再从B到C的距离最大值 需要满足AB的距离小于AC的距离 题解:首先树上的最大距离就想到了直径 但是被样例误导了TAT BC两点构成了直径 我一开始以为A在直径上答案最大 然后再加上最接近路径长度一半的路径 其实 A不在直径上的话显然更优啊... 那么做法就是先求出直径 然后记录路径 枚举路上的每一个点能到达的最远的路径 当然这个最远路径不能和直径有公共边 复杂度的话想想还挺有意思的 从直径上走刚好遍历整棵树 总结:突然发现这个题数据水了.. 我这个…
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分钟才能找到Chri…
题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:"根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话."说完砰的一声把电话挂了. Chris居住…
题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:“根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话.”说完砰的一声把电话挂了. Chris居住的城市由N个居住点和若干条连…
Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1Ui, Vi  N,1  Ti  1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟.街道信息不会重复给出.Output 仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris.Sample Input 4 3 1 2 1 2 3 1 3 4…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1509 直接求出树的直径,枚举每个点更新一遍答案. #include<cstring> #include<iostream> #include<algorithm> #include<cstdio> #define maxn 200500 #define rep(i,l,r) for (int i=l;i<=r;i++) #define down(i…
原题地址 今天翻看集训队巨佬写的一篇有关于树形动规的论文时看到了这道题,但感觉并不需要用动规,求出树的直径再暴力枚举一下就搞出来了. 其实是因为我太弱了,看不懂大佬在写什么orz 代码实现如下: #include <bits/stdc++.h> using namespace std; #define int long long #define rep(i, a, b) for (register int i = a; i <= b; i++) ; ; int dis1[maxn], d…
题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:“根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话.”说完砰的一声把电话挂了. Chris居住的城市由N个居住点和若干条连接居住点的双…
题目: 分析: 首先明确我们是要求 min(dist[C][A],dist[C][B])+dist[A][B]. 我们把C当成树根,第一我们可以发现min里面取dist[C][A]或者dist[C][B]其实是一个意思(因为可以交换). 接着可以发现dist[A][B]实际上是这棵树的直径.如果不是,那么答案一定不是最优的.我们可以这样去想: 如果dist[A][B]不是直径,那么一定有dist[C][A']使得比dist[C][A]更优,而且A'一定是直径的一个端点:-).加号的前面和后面都不…
Description: Input: 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1Ui, Vi  N,1  Ti  1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟.街道信息不会重复给出. Output: 仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris. 思路:由于规则2,可知题目给出的是一棵树 然后求一根直径…
Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1126  Solved: 567[Submit][Status][Discuss] Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1Ui, Vi  N,1  Ti  1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟.…
题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:"根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话."说完砰的一声把电话挂了. Chris居住…
Input 第一行是两个整数N(3 <= N <= 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1<=Ui, Vi <= N,1 <= Ti <= 1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟.街道信息不会重复给出. Output 仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris. 输入输出样例 Intput: 4 3 1 2 1…
题目大意 题目链接 PS:可能出题人为了提高难度故意加了很多废话--实际上题目是很简单的 在一棵树上找3个点A.B.C,使AB+BC最大,且满足AC>AB. 样例输入 4 31 2 12 3 13 4 1 样例输出 4 思路 从一个点出发,找到两条路径,使路径和最大,那么肯定其中一条是树的直径. 设AB是树的直径,剩下直接枚举,找到一个离直径端点最远的C点. (A.B.C只是个符号而已,可以随便互换的) 不过还有一个条件是AC>AB,所以枚举的时候,选AC和BC里小的作为第二条路径. 比如AC…
一边一定是直径,另一边从两端点走取最小值的最大值 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++ a) #define nR(a,b,c) for(register int a = (b);…
本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离,最后以每个节点为c枚举求最大距离即可. 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=200100; 5 int n,m,x,y,z,tot,p,q,head[N];…
1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 995  Solved: 505[Submit][Status][Discuss] Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1Ui, Vi  N,1  Ti  1000000000),表示街道i连接居住点U…
P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:"根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话."…
[NOI2003 逃学的小孩] 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心急如焚,他们决定在尽量短的时间内找到Chris.他们告诉Chris的老师:"根据以往的经验,Chris现在必然躲在朋友Shermie或Yashiro家里偷玩<拳皇>游戏.现在,我们就从家出发去找Chris,一但找到,我们立刻给您打电话."说完砰的…
传送门:>HERE< 题意:给出一棵树(带权),要从一个节点C先走到距离它近的一个节点B,再走到A,要求最坏情况下的总路程(即最长). 解题思路: 乍一看,A,B,C都没给出,这怎么求? 不妨设距离C较近的点位A. 分析发现,无论怎样,A~B是一定要走的.那么如何能让树上任意两点间距离最大呢?不难发现A,B就是该树直径的两个端点.那么只要两遍BFS就好了. 那么如何让A~C的路程最长呢?注意到A到C相较A到B是较短的.所以好像不怎么好求……但是可以枚举——枚举每个点作为C到A和B的距离,求出较…
题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include…
Link: BZOJ 1509 传送门 Solution: 一开始受样例影响又犯了想当然的毛病……图中的C点不一定在直径上! 3次$dfs$求出树的直径及直径的两个端点$rt1,rt2$到每个点的距离$d1,d2$, 则结果为$max\{ Diameter+min\{ d1[i],d2[i] \} \}$ Tips:如果要求出直径上每个点或求点到直径端点的距离时,最好还是用2次$dfs$的方法,而不使用一遍$dfs$法 Code: #include <bits/stdc++.h> using…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1509 [算法] 树的直径 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 200010 struct edge { int to,w,nxt; } e[MAXN << ]; int i,n,m,u,v,w,s,t,tot; int head[MAXN]; long long dista[MA…