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 }