SPFA算法的伪代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPFA算法的伪代码相关的知识,希望对你有一定的参考价值。

参考技术A

SPFA实际上是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算法的伪代码的主要内容,如果未能解决你的问题,请参考以下文章

Bellman-Ford算法的伪代码

算法中的伪代码语法格式 - 算法实现表达利器

这个 Forster-Overfelt 版本的 Greiner-Horman 多边形裁剪算法的伪代码有啥问题?

论文伪代码怎么写

一个简单的伪随机数发生算法(转)

需要有关日期格式和验证的伪代码的帮助