为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Bellman-Ford Pascal

来自NOCOW
跳转到: 导航, 搜索
{单源最短路径的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
  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);//初始值为无穷大
  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);//其中edges[j]=(a,b),即edges[j]的两个节点为a和b,w是edges[j]的权重
  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;
 {========main========}
 begin
 init;
 if bellman_ford then show
  else writeln('Error!!')
 end.
个人工具