spfa和bellman-ford复杂度是同阶的。虽然据说spfa复杂度是O(K*E)(k为某个常数,2~3),但是最坏情况下为O(N*E),卡spfa的题目无法通过。
所以有正边的时候最好用dikstra+heap优化,并且有priority queue代码量不会很大
1.bellman-ford算法:
bellman-ford算法的核心是松弛操作:
用一个while(true)循环;不断检测对于每条边,可以不可以进行松弛操作,如果没有一条边可以进行松弛操作,则退出循环。在没有负边的时候,松弛操作一定是有限的,故最后一定会退出循环。
如果图中不存在负环,那么最短路就不会经过同一个顶点两次
代码
sturct edge{ int from,to,cost; };
edge es[maxn];
int dis[maxn];
int V,E;
void BellmanFord(int s){
for(int i=0;i<V;i++) dis[i]=INF;
dis[s]=0;
while(true){
bool update = false;
for(int i=0;i<E;i++){
edge cur=es[i];
if(dis[e.from]!=INF && dis[e.to]>dis[from]+e.cost){
dis[e.to]=dis[e.from]+e.cost;
update=true;
}
}
if(!update) break;
}
}