SPFA
算法优点:
1.时间复杂度比普通的Dijkstra和Ford低。
2.能够计算负权图问题。
3.能够判断是否有负环
核心思想
我们采取的方法是动态逼近法:
1.设立一个先进先出的队列
2.每次取出队首元素,用队首元素到起点的最优值对与其相连的其他元素的到起点的最优值进行优化(a+b>c)正确性是显然的
3.当队列为空时及所有元素优化到不能再优化了,算法结束
SPFA对于负边权的处理
SPFA对于所有正边权都双向存边
对于所有负边权都单项存边
why???!!!
因为若对负边权双向存边的话,设a,b两点之间边权为-2,a->b b->a 。a,b可以互相无限松弛,没有个头,这样的话还怎么判断负环和单个的负边权呢!(重点重点重点)
||好了,如果单项存边,那么这个负边权只能由a->b被使用,b->a使用不了,所以可以满足要求
SPFA对于负环
由于负边权时单向储存的,假设三个点a,b,c;
a->b;b->c;c->a;
如果a,b,c转了一圈a点的值变小了的话,那么可以用a再一次更新b,b再一次更新a,a又获得一个更小值,如此往复;
如果当a进队超过n-1次那么一定存在负环,因为n个点的图,入度最大为n-1,若超过n-1,那么一定存在负环