这是一个毁三观的题...
题目首先给出了一个slf优化的SPFA的代码,然后让你hack他...
经过这道题..再也不敢用slf优化了..或者说这根本不是个优化...
slf优化就是说,在spfa的队列中,如果要加入队列的节点比当前的队首节点距离还要小,则将其添加到队首而不是队尾...也就是说,类似dijkstra,优先从距离近的点出发。
这个看起来效果不错的优化,实际上有着致命的问题,在特别的图上,复杂度会退化到2^n。
在这个图中,我们设计算从i到n的最短路所需要的运算次数为f(i),则对于奇数号点p,如1,3,..,n,会把p+1放到队尾,把p+2放到队首,因为p+2在队首,所以会先从p+2开始,又因为后边所有的边都是非正的,所以他们不会小于p+2,即他们也会放到队首。这样我们就先计算了以下从p+2出发的一次最短路,然后在从p+1到p+2,更新了p+2的值,又重新计算了一次从p+2出发的一次最短路。这样我们可以得出f(i)>2*f(i+2),这个递归式显然是指数增长的,即只需30对点,就可以让它的复杂度增长到2^30。
过这道题的代码是这样的..无须考虑输入数据...
</