poj 2449

该博客介绍了如何解决POJ 2449题,即寻找从点S到点T的第K短路径。博主通过将图反转,利用Bellman-Ford算法求得从T到其他点的最短距离,再结合A*算法,找出第K短路径。讨论部分提到了算法实现细节,包括优先队列的使用和重载比较操作符的注意事项。最后,博主分享了自己的C++代码实现。
摘要由CSDN通过智能技术生成

题目概述

有N个地点,编号1到N,地点之间有M条单向路,要沿着第K短路从S到T,问其用时

时限

4000ms/12000ms

输入

第一行整数N,其后N行,每行三个整数a,b,c,描述一条路的起点,终点,途经用时,最后一行三个整数S,T,K,输入只有一组

限制

1<=N<=1000;1<=M<=100000;1<=c<=100;1<=K<=1000

输出

一个数,所求用时,若不存在第K短路则为-1

样例输入

2 2
1 2 5
2 1 4
1 2 2

样例输出

14

讨论

图论,第K短路,bellman_ford队列优化+A*,先将图中边反转,构图求最短路,这是从T到其他点的最短距离,然后A*,A*需要利用一个公式,f=g+h,这里h就是刚求的T到其他某点最短路长,g是从S到同一个点最短路长,f的意义自然就是从S经过某点到T的最短路长,显然经过的这个某个点不一定是最短路上的点,因而这条路也不一定最短路,但一定是经过这个点的最短路,那这就好办了,把所有的f都排序,去掉最短的,下一个就是次短,再去,就是第三短,最终总能找到第K短的,由于不知道到底哪些点在最短路上,因而选定这个某个点为终点T就好了,终点肯定在最短路上,第K次遇到这个某个点为终点的路,这条路就是第K短路,为什么不选起点?因为f描述的就是从起点S出发的,起点和终点都是自己,这不符合条件
从实现层面上,首先需要一个优先队列完成上述排序工作,每次弹出一个点,然后将其连接的点计算出f,之后塞到队列中,另外需要注意优先队列每次弹出的是最大的,因而重载小于号时需要留意,重载方向错也能过样例,但只会是MLE,因为会无限入队,另外有个坑,起点就是终点的时候不能算,可惜额没有找到原题中这句话在哪里
题目的意思到底是什么已经不重要了,可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值