有一个无向图,共 N 个节点,编号 1 至 N,共 M 条边。FJ 在节点 1,它想到达节点 N。FJ 总是会选择最短路径到达节点 N。作为捣蛋的奶牛 Bessie,它想尽量延迟 FJ 到达节点 N 的时间,于是 Bessie 决定从 M 条边之中选择某一条边,使得改边的长度变成原来的两倍,由于智商的问题,Bessie 不知道选择加倍哪条边的长度才能使得 FJ 到达 N 号节点的时间最迟。注意:不管 Bessie 选择加倍哪条边的长度,FJ 总是会从 1 号节点开始走最短路径到达 N 号点。 输入描述 第一行,两个整数 N 和 M. 1 <=N<=250, 1<=M<=250000。 接下来有 M 行,每行三个整数:A,B,L,表示节点 A 和节点 B 之间有一条长度为 L 的无向边。1<=L<=1000000。
时间: 2024-03-19 10:42:46 浏览: 336
这是一道图论问题,可以使用 Dijkstra 算法求解。具体步骤如下:
1. 构建图的邻接表,存储每个节点的相邻节点和边的长度;
2. 使用 Dijkstra 算法找到节点 1 到节点 N 的最短路径,并记录下这条路径经过的边;
3. 枚举每条经过的边,将该边的长度翻倍,再重新使用 Dijkstra 算法求解节点 1 到节点 N 的最短路径;
4. 记录下每种方案下节点 1 到节点 N 的最短路径的长度;
5. 输出这些长度中的最大值。
具体实现可以参考下面的代码(其中用到了 C++ STL 中的优先队列):
阅读全文