POJ2449 Remmarguts' Date

A*+Dijkstra=Kth-shortest-path

概述

这道题好久之前写的..
因为坚持写博客有好处,而且zrt犇留的作业里也有这道题,所以还是决定了要重温下这道题的解法

https://code.csdn.net/snippets/1631890

裸的第k短路么..
A*加反向图的单源(当估价)解。
第几次从队列里弹出点i,则就找到了点i的第几短路

终止条件

必要性和合理性

题目出题者不会总是很善意地。。。
如果这张图压根没有第k短路(比如本来就不联通,或者通路条数小于k)。。因为A*不终止,会把能求出第NNN短路的所有点都试着求下去…
如果图没环,那不会造成问题。但是要是有个正环(怎么会有负环..),那算法就不会停机了.

思路

更新到目标点的第k短路上的所有点更新次数都不能超过k
人家已经是第k+1短路了,从这个点继续往下搜肯定得到的是大于等于k+1短路的路径,和答案不会有关系,没有必要再扩展它了。

实现
int time[maxn];
//...
if(++time[mn.second]>k) continue;
//....

编写中出现的一些秀逗导致的错误

看你能找到错误吗..

#define REP(i, s, e) for(int i=s; i<=e; ++i)
REP(j, 0, in[mn.second].size()-1)
{
    /*...
    ...*/
}

就算里面什么也不写,这段代码也足以导致超时了。、
为什么TAT?
因为STL中的容器元素size()返回的是0~npos的非负整数!!

unsigned int 类型只能存储非负整数,因为它根本没有设置符号位和补码
如果容器空,则size()-1不是-1,而是214748347

谨此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值