SPFA算法心得

SPFA算法是改进后的Bellman-Ford算法,只是速度更快,而且作为一个算法,它更容易理解和编写,甚至比Dijkstra和B-F更易读(当然,Floyd是另一回事了,再也没有比Floyd还好写的最短路算法了,动规中这么简洁的也少见).

详细说说SPFA

SPFA,即Shortest Path Faster Algorithm.

SPFA算法的核心很简单:

#设Dist[j]为当前原点(S点)到j点的最短路
    #(我会尽量避免"松弛"这个半懂不懂的词)
#在初始状态下Dist[S]=0,
#Dist[i](i in G<V,E>.E not S)=Infinity
    #(这里可以随便设置一个值)
#记Front[i]为最短路中i的前驱节点,即
#通向i的节点,初始值Front[i]=0
    # -> ( i in G<V,E>.E )
#维护队列保持求解中的点
#Queue<Array,head,tail>::__queue
#(为了判断负权圈,维护一个访问数组Access[i])
    #(表示i被加入队列过几次)
#Queue中加入S
while(!Queue.empty){
    a=Queue.head
    for b in FrontList[a].list.iterator(@to) {
        if(Dist[u]+FrontList[a].lengthTo(b)<Dist[b]){
            Dist[b]=Dist[u]+FrontList[a].lengthTo(b)
if(!Inqueue.find b){
Inqueue.push b
Queue.push b
Access[b]++
if(Access[b]>nFrontList.pointsCount){
                  puts "Invalid graph with Nagetive weight loop"
                  exit(0)
              }
}
} } Queue.popHead }
posted @ 2014-08-06 22:04  zball  阅读(264)  评论(1编辑  收藏  举报