- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Bellman-ord算法
Bellman-ford算法
参考代码
{ 单源最短路径的Bellman-ford算法
执行v-1次,每次对每条边进行松弛操作
如有负权回路则输出Error
}
const
maxn = 100;
maxe = maxn * (maxn-1)div 2;
type
edge = record
a,b,w: integer;
end;
var
edges: array[1..maxe]of edge;
dis: array[1..maxn]of integer;
pre: array[1..maxn]of integer;
e, n, s: integer;
procedure init;
var i: integer;
begin
assign(input, g.in);
reset(input);
readln(n, s); // 读入顶点个数和源点编号
e := 0;
while not eof do
begin
inc(e);
with edges[e] do readln(a,b,w); //读入每条边的信息,并存入边集数组
end;
fillchar(dis, sizeof(dis), $7f); //所有点的最短距离的初始值为无穷大
dis[s] := 0;pre[s] := s;
end;
procedure relax(u, v, w: integer); // 能否解决负权边问题?
begin
if dis[u] + w dis[v] then
begin
dis[v] := dis[u] + w;
pre[v] := u;
end
end;
function bellman_ford: boolean;
var i, j: integer;
begin
for i:=1 to n-1 do
for j:=1 to e do
with edges[j] do
relax(a,b,w);
for i:=1 to e do
with edges[i] do
if dis[a] + w dis[b] then exit(false);
exit(true)
end;
procedure print_path(i:integer);
begin
if pre[i]s then // 利用递归来倒序打印
print_path(pre[i]);
write(--,i)
end;
procedure show;
var i: integer;
begin
for i:=1 to n do
begin
write(i:3,:,dis[i]:3,:,s);
print_path(i);
writeln
end;
end;
begin
init;
if bellman_ford then
show
else
writeln(Error!!);
end.
SPFA算法
算法简介:
SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。也有人说SPFA本来就是Bellman-Ford算法,现在广为流传的Bellman-Ford算法实际上是山寨版。
算法流程:
算法大致流程是用一个队列来进行维护。初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束。
这个算法,简单地说,就是利用队列优化过的Bellman-Ford算法,是利用了每个点的更新次数不会太多这一特点而发明的算法。
SPFA——Shortest Path Faster Algorithm,它可以在O(kE)的时间复杂度内,求出源点到其他所有点的最短路径,可以处理负边。SPFA的实现甚至比Dijkstra或者Bellman-Ford还要简单:
设Dist[i]代表源点S到任一顶点 i 的当前最短距离,Fa代表S到 i 的当前最短路径中,i 点之前的一个点的编号。开始时Dist全部为+∞,只有Dist[S]=0,Fa全部为0。
维护一个队列,里面存放所有需要进行迭代的点。初始时,队列中只有一个点S。此外,再用一个布尔数组,记录每个点是否处在队列中。
每次迭代时,取出队首的点v,依次枚
文档评论(0)