第一次做类似的题目,卡了好几天,最后看了爱酱的blog(http://blog.csdn.net/acm_cxlove/article/details/8679230)才会的,sad
题意大概是这样,给你一个图,求起点1到N的最短时间,你有一双鞋子,可以加速,一次性花费0的时间行走M单位的路程,但是鞋子只能用K次,并且鞋子使用的时候起点和终点都必须在节点上,不能在半路停下。并且使用的鞋子的时候不能穿过编号大于A的节点,在不使用鞋子的情况下行走单位路程花费单位时间。
dp[i][k]表示从起点到i这个点在使用了k次鞋子之后所要花费的最短时间。
显然有dp[i][k] = min{dp[j][k-1],dp[j][k]+d[j][i]},j != i
但是更新的顺序是个问题,容易产生后效性,一开始用dijkstra的时候就无法避免,但是用spfa的只要更新的时候顺便转移就好了
#include #include #include #include #include #include #include #include