poj 2449

题目概述

有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,因为会无限入队,另外有个坑,起点就是终点的时候不能算,可惜额没有找到原题中这句话在哪里
题目的意思到底是什么已经不重要了,可

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值