dis:
=z;
flag:
=false;
end;
end;
begin
fillchar(pa,sizeof(pa),0);
readln(p,c);{C为边数p为点数}
fori:
=1tocdoreadln(e.a,e.b,e.d);{a点和b点相通,长度为d}
s:
=1;{单源最短的源}
fori:
=1topdodis[i]:
=max;{初始化}
dis[s]:
=0;
主程序
repeat
flag:
=true;
fori:
=1tocdo
withedobegin
relax(a,b,d);
relax(b,a,d);
end;
untilflag;
forI:
=1tondo
writeln(dis[i]);
end.
SPFA算法
初始时将源加入队列.每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队.直到队列为空时算法结束.
SPFA算法的效率
时间复杂度一般认为是O(kE)
其中k是一个较大的常数,不好估计,但是可以看出SPFA算法效率应当是很高的
经验表明Dijkstra算法的堆优化要比SPFA快,但SPFA比普通的Dijkstra算法快.而SPFA算法可以处理负权的问题,而且比Dijkstra算法的堆优化的代码要容易实现,因此SPFA是一个很好的算法.
SPFA在处理稀疏图时效果比较不错在处理稠密图时可能没有Floyd好
programSPFA;
const
maxn=800;{最大点}
maxq=maxn;{最大边}
var
n,p,c:
integer;
map:
array[1..maxn,1..maxn]ofinteger;{图}
dis:
array[1..maxn,1..maxn]oflongint;{距离}
connect:
array[1..maxn,0..maxn]ofinteger;{存图}
procedureinit;
var
i,x,y,distance:
integer;
begin
初始化
fillchar(connect,sizeof(connect),0);
fillchar(map,sizeof(map),255);
readln(p,c);{p为点C为边}
fori:
=1tocdo{读入}
begin
readln(x,y,distance);
if(map[x,y]=1)or(distance