[NOI2003] 逃学的小孩

题目描述

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

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

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

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

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

输入格式

输入文件第一行是两个整数 NNN 和 MMM,分别表示居住点总数和街道总数。

以下 MMM 行,每行给出一条街道的信息。第 i+1i+1i+1 行包含整数 UiU_{i}Ui​、ViV_{i}Vi​、TiT_{i}Ti​,表示街道 iii 连接居住点 UiU_{i}Ui​ 和 ViV_{i}Vi​,并且经过街道 iii 需花费 TiT_{i}Ti​ 分钟。街道信息不会重复给出。

输出格式

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

样例 #1

样例输入 #1

4 3
1 2 1
2 3 1
3 4 1

样例输出 #1

4

提示

对于 100%100\%100% 的数据,3≤N≤2×1053 \le N \le 2\times 10^53≤N≤2×105,1≤Ui,Vi≤N1 \le U_{i},V_{i} \le N1≤Ui​,Vi​≤N,1≤Ti≤1091 \le T_{i} \le 10^{9}1≤Ti​≤109。

1、 两次DFS 求树的直径随便选择一个点(假如是1),  求出所有点与1 的距离 d[k], 取一个点A ,使得d[A] 最大。那么A点一定是树的直径的一个端点。然后以A为顶点,求出所有点与A的距离 d[k]( 1 <= k <= n), 取一个点B ,使得d[B] 最大.点A 和B之间的路径一定是树的直径。
2、题目的答案就是 找到一个点k, 先从k点走到A点,然后从A点走到B点,距离 = dAK(或者dBK) + dAB; 总而言之,直径dAB 是必须走的距离。 题目要求 k点走到 A 或者 B的距离取较小值,ans = max{dAB + min(dAk, dBk)}
3、 开两个距离数组 ll d1[N], d2[N];ll d1[N];    // A 点的距离数组ll d2[N];    // B 点的距离数组最后遍历一下,取 max{ min(d1[k], d2[k])} 即可

算法竞赛进阶指南,图论习题 9

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10, M = 4e5 + 10;
int head[N], ver[M], Next[M], edge[M];
int n, m, tot;
ll d1[N], d2[N];
int A, B;           //树的直径的两个端点
bool vis[N];
ll maxlen;
ll d0[N];void add(int x, int y, int z)
{ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
}void dfs(int x, ll d[])
{vis[x] = true;for(int i = head[x]; i; i = Next[i]){int y = ver[i];if(!vis[y]){d[y] = d[x] + edge[i]; dfs(y, d);}}
}// ans = max{dAB + min(dAk, dBk)}
void calc()
{ll ans = 0; for(int i = 1; i <= n; ++i){if(i != A && i != B){//      printf("d1[%d] = %d, d2[%d] = %d\n", i, d1[i], i, d2[i]);ll tmp = min(d1[i], d2[i]);ans = max(tmp, ans);}}
//  printf("d1[B] = %d\n", d1[B]);ans += d1[B];printf("%lld\n", ans);
}int main()
{scanf("%d%d", &n, &m);int x, y, z;   for(int i = 0; i < m; ++i){scanf("%d%d%d", &x, &y, &z);add(x, y, z); add(y, x, z);}dfs(1, d0);for(int i = 1; i <= n; ++i){if(maxlen < d0[i]){maxlen = d0[i];A = i;}}memset(vis, false, sizeof vis);dfs(A, d1);maxlen = 0;for(int i = 1; i <= n; ++i){if(maxlen < d1[i]){maxlen = d1[i];B = i;}}memset(vis, false, sizeof vis);dfs(B, d2);//找到树的直径的两个端点 A, Bcalc();return 0;
}

洛谷 P4408 [NOI2003] 逃学的小孩(树的直径)相关推荐

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

    [NOI2003] 逃学的小孩 - 洛谷https://www.luogu.com.cn/problem/P4408一道学习树的直径的好题. 题目要求最长的时间,说明答案应该是树的直径+max(起点离 ...

  2. 洛谷P4408 [NOI2003]逃学的小孩

    链接 https://www.luogu.org/problem/show?pid=4408 大意 求 max{dis[A][B]+min(dis[B][C],dis[A][C])}max\{dis[ ...

  3. 【洛谷P4408】逃学的小孩【树的直径】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P4408 给出一棵树,已知有人一开始在CCC点,要到达AAA点和BBB点(那个近先去哪).求最坏的情 ...

  4. 【洛谷 P4408】逃学的小孩【树的直径】

    知识点:树的直径 解题思路 题目中"可以保证,任两个居住点间有且仅有一条通路"说明输入数据是一棵树.显然最优解需要从C先跑到A在跑到B.或者从C先跑到B在跑到A. 假设我们已经确定 ...

  5. BZOJ1509: [NOI2003]逃学的小孩(树的直径)

    Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1126  Solved: 567 [Submit][Status][Discuss] Descripti ...

  6. luogu P4408 [NOI2003]逃学的小孩(树的直径)

    整理的算法模板合集: ACM模板 看了半天的题原来没有告诉你三个点的坐标,不然直接跑最短路即可.要求最长的时间,所以我们要自己找到三个点,而在树中最长的路径也就是树的直径.那么本题就可以简化为:在一棵 ...

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

    题面传送门 显然最长的一条是树的直径. 那么找到树的直径后另一条枚举点然后跑spfaspfaspfa即可. 代码实现: #include<cstdio> #include<queue ...

  8. P4408 [NOI2003] 逃学的小孩 题解

    目录 贪心及其证明 C++C++C++ 实现 ::: 贪心及其证明 设 A,BA,BA,B 为树直径的端点 ,,, Distx,yDist_{x,y}Distx,y​ 为树上两点的距离 ,,, 则答案 ...

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

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

最新文章

  1. Xamarin Essentials教程安全存储SecureStorage
  2. 【Linux】【Basis】文件系统
  3. leetcode 349. 两个数组的交集 两种方案,c语言实现
  4. linux shell审计--snoopy的注意事项
  5. php读取excel的公式,PHPExcel在解析xlsx文件中的公式时返回零“0”
  6. 解析底层原理!Android开发者面试如何系统复习?帮你突破瓶颈
  7. 移动端类似IOS的滚动年月控件(需要jQuery和iScroll)
  8. 统一软件开发过程(rup)理解
  9. iOS APP 比较版本号,检测更新
  10. MVCC(Multiversion concurrency control)
  11. 模拟电子技术基础:基本放大电路
  12. lingoes/灵格斯词霸/灵格斯翻译家开始弹窗去除方法
  13. c语言控制电机正反转程序,C语言实现控制电机加减速正反转(飞思卡尔C代码)
  14. rxtx for java_RXTX串口通信 java
  15. mysql远程3306不通_mysql服务器3306端口不能远程连接的解决
  16. woocommerce-paypal-payments/modules/ppcp-button/src/Assets/SmartButton.php如何解决AVADA主题
  17. 如何快速成为谷歌web Store开发者(不用办visa/信用卡)
  18. 点阵图(位图)与矢量图的区别
  19. 2-Arduino小车测速模板安装与测试
  20. 【C# 教程系列第 12 篇】抽象类的简单实现

热门文章

  1. docker-error-at \\\“/dev/mqueue\\\“ caused \\\“no such device
  2. python -i 豆瓣源
  3. 如何提升自身能力?不再平庸
  4. 微信小程序页面上面的名字怎么改_微信小程序取名|如何修改名字|取名规则!...
  5. 计算机专业英语中tour的意思,计算机专业英语自我介绍
  6. 弥散圆以及最大弥散圆
  7. 《途客圈创业记:不疯魔,不成活》一一1.1 途我睿的由来
  8. 直流电机控制 pwm 和 pid 算法
  9. 《Spring》第二十一篇 事务底层源码解析
  10. 智联招聘的python岗位数据词云制作