SPFA算法的伪代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPFA算法的伪代码相关的知识,希望对你有一定的参考价值。
参考技术ASPFA实际上是Bellman-Ford基础上的队列优化
一种伪代码 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(Q,v); end; end;End;一种更容易读懂的伪代码: ProcedureSPFA;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(Q,v); end; end;End;
Bellman-Ford算法的伪代码
参考技术A For i:=1 to |V|-1 do
For 每条边(u,v)∈E do
Relax(u,v,w);
For每条边(u,v)∈E do
If dis[u]+w<dis[v] Then Exit(False) bool Bellman-Ford(G,w,s) //图G ,边集 函数 w ,s为源点
1 for each vertex v ∈ V(G) //初始化 1阶段
2 d[v] ←+∞;
3 d[s] ←0; //1阶段结束
4 for(int i=1;i<|v|;i++) //2阶段开始,双重循环。
5 for each edge(u,v) ∈E(G) //边集数组要用到,穷举每条边。
6 if(d[v]> d[u]+ w(u,v))//松弛判断
7 d[v]=d[u]+w(u,v); //松弛操作2阶段结束
8 for each edge(u,v) ∈E(G)
9 if(d[v]> d[u]+ w(u,v))
10 return false;
11 return true; 单源最短路径的Bellman-ford算法
执行v-1次,每次对每条边进行松弛操作
如有负权回路则输出Error
const maxn=100; maxe=maxn*(maxn-1)div2;type edge=record a,b,w:integer; end;var edges:array[1..maxe]ofedge; dis:array[1..maxn]ofinteger; pre:array[1..maxn]ofinteger; e,n,s:integer;procedureinit;vari:integer;begin e:=0; assign(input,'g,in');reset(input); readln(n,s); while not eof do begin inc(e); with edges[e] do readln(a,b,w); end; fillchar(dis,sizeof(dis),$7f);//$7f是什么,解释替换$7f是127$在pascal中代表后面的数是16进制 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; endend;function bellman_ford:boolean;var i,j:integer;begin fori:=1ton-1do forj:=1toedo 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;procedureprint_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;========main========begin init; if bellman_ford then show else writeln('Error!!')end. #include<iostream> #include<cstdio> using namespace std; #define MAX 0x3f3f3f3f #define N 1010 int nodenum, edgenum, original; //点,边,起点 typedef struct Edge //边 int u, v; int cost; Edge; Edge edge[N]; int dis[N], pre[N]; bool Bellman_Ford() for(int i = 1; i <= nodenum; ++i) //初始化 dis[i] = (i == original ? 0 : MAX); for(int i = 1; i <= nodenum - 1; ++i) for(int j = 1; j <= edgenum; ++j) if(dis[edge[j].v] > dis[edge[j].u] + edge[j].cost) //松弛(顺序一定不能反~) dis[edge[j].v] = dis[edge[j].u] + edge[j].cost; pre[edge[j].v] = edge[j].u; bool flag = 1; //判断是否含有负权回路 for(int i = 1; i <= edgenum; ++i) if(dis[edge[i].v] > dis[edge[i].u] + edge[i].cost) flag = 0; break; return flag; void print_path(int root) //打印最短路的路径(反向) while(root != pre[root]) //前驱 printf(%d-->, root); root = pre[root]; if(root == pre[root]) printf(%d\\n, root); int main() scanf(%d%d%d, &nodenum, &edgenum, &original); pre[original] = original; for(int i = 1; i <= edgenum; ++i) scanf(%d%d%d, &edge[i].u, &edge[i].v, &edge[i].cost); if(Bellman_Ford()) for(int i = 1; i <= nodenum; ++i) //每个点最短路 printf(%d\\n, dis[i]); printf(Path:); print_path(i); else printf(have negative circle\\n); return 0;
以上是关于SPFA算法的伪代码的主要内容,如果未能解决你的问题,请参考以下文章