(转)bellman_ford和spfa讲…
来源:互联网 发布:盘锦企业数据 编辑:程序博客网 时间:2024/06/10 17:25
一、Bellman-Ford算法
最优性原理
它是最优性原理的直接应用,算法基于以下事实:
l
l
l
适用条件&范围
l
l
l
l
算法描述
l
l
时空复杂度
for i:=1 to |V|-1 do
for每条边(u,v)∈E do
ifdis[u]+w<dis[v] Then Exit(False)
算法时间复杂度O(VE)。因为算法简单,适用范围又广,虽然复杂度稍高,仍不失为一个很实用的算法。
改进和优化
二、
算法简介
SPFA(Shortest PathFaster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,可以处理负边。
算法流程
SPFA对Bellman-Ford算法优化的关键之处在于意识到:只有那些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变。因此,算法大致流程是用一个队列来进行维护,即用一个先进先出的队列来存放被成功松弛的顶点。初始时,源点s入队。当队列不为空时,取出队首顶点,对它的邻接点进行松弛。如果某个邻接点松弛成功,且该邻接点不在队列中,则将其入队。经过有限次的松弛操作后,队列将为空,算法结束。SPFA算法的实现,需要用到一个先进先出的队列queue和一个指示顶点是否在队列中的标记数组mark。为了方便查找某个顶点的邻接点,图采用临界表存储。
算法代码
Procedure SPFA;
Begin
initialize-single-source(G,s);
initialize-queue(Q);
enqueue(Q,s);
while not empty(Q) do begin
u:=dequeue(Q);
for each v∈adj[u] do begin
tmp:=d[v]; relax(u,v);
if (tmp<>d[v]) and (not v in Q) then enqueue(v);
end;
end;
End;
负环处理
判断负权回路的方案很多,世间流传最广、比较容易实现并且高效的方法的是记录每个结点进队次数,超过|V|次表示有负权。
三、
POJ 1201Intervals 差分约束系统
设S(i)为 0..i-1中在最终序列中的的整数个数。则约束条件如下:
S(b)-S(a) >= c
0 <= S(i+1) - S(i)<= 1 <==> S(i+1)-S(i)>= 0;
注意本题要求的是最小值,而按照>=号建图后发现图中有负环,怎么办呢?
其实很简单, 本题求的不是最短路,而是最长路! Bellman_ford即可!
POJ 1275Cashier Employment 出纳员的雇佣
黑书上有详细讲解
POJ 1364King 差分约束系统
这个题目构图之后,只需要用bellman_ford判断是否有负圈.
构图方法:
首先进行转换:a[j]+...+a[j+m] = a[1]+...a[j+m] -(a[1]+...+a[j-1]) = sum[j+m] -
sum[j-1] >(<)ki. 差分约束只能全部是<=或者(>=).
第二步转换: sum[j+m]-sum[j-1] <=ki-1 或者 sum[j-1]-sum[j+m] <=-ki-1.
约束图构造好后就是简单的Bellman-Ford了!
POJ 1716Integer Intervals 是1201的简单版本,贪心算法能够得到更好的效果.
POJ 2983 Is theInformation Reliable?
差分约束题, 处理一下等号的情况,然后普通的Bellman_ford
POJ 3159Candies 最短路径
Bellman-Ford超时,Dijkstra算法可以高效解决,SPFA(队列)居然超时...SPFA修改为堆栈实现就过了.
POJ 3169Layout 差分约束
Bellman-Ford 和 SPFA实现均可
POJ 3259Wormholes 判断负权回路
TOJ 2976 Path 单纯的最短路径 可练习SPFA
ZOJ 3033 BoardGames 我做的第一道Bellman-Ford题目
首先,DFS判断可达性,不可达直接输出infinity结束,可达,bellman-ford判断是否存在负环,存在输出infinity,否则,输出最短距离。
- (转)bellman_ford和spfa讲…
- poj3259( spfa 和 bellman_ford)
- Bellman_Ford算法->SPFA算法
- Bellman_ford算法,SPFA
- Spfa算法+bellman_ford算法
- SPFA算法 Bellman_ford优化
- Bellman_ford和SPFA判断是否存在负环
- Bellman_Ford和Spfa两种方法判断负环
- poj 3259 最短路判负环 spfa算法和Bellman_ford算法
- 【POJ 3259】Wormholes(最短路SPFA/Bellman_Ford)
- (POJ 3259)Wormholes 判断负环 bellman_ford 或者 spfa
- poj Til the Cows Come Home(dijkstra,bellman_ford,spfa)
- hdu1317 XYZZY(floyd、bellman_ford判环)(spfa)
- uva_558 Wormholes (spfa 或 bellman_ford)
- POJ3259 Wormholes SPFA 或者 bellman_ford
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- POJ-2485-Highways
- POJ-1258-Agri-Net
- POJ-3026--Borg Maze
- POJ-3037-Skiing
- K短路-POJ-2449
- (转)bellman_ford和spfa讲…
- json和xml比较
- 差分约束系统-POJ-1364
- 无向图-最小环-Floyd
- POJ-1860-Currency Exchange
- POJ-3259-Wormholes
- POJ-2253-Frogger
- Mysql 数据导入导出
- Java获取当前路径