---恢復內容開始---
bellman—ford演算法能在更普遍的情況下(存在負權邊)解決單源點最短路徑問題。對於給定的帶權(有向或無向)圖g=(v,e),其源點為s,加權函式w是邊集e的對映。對圖g執行bellman—ford演算法的結果是乙個布林值,表明圖中是否存在著乙個從源點s可達的負權迴路。若存在負權迴路,單源點最短路徑問題無解;若不存在這樣的迴路,演算法將給出從源點s到圖g的任意頂點v的最短路徑值d[v]
bellman—ford演算法流程
分為三個階段:
(1)初始化:將除源點外的所有頂點的最短距離估計值
dis[v]ß+∞,dis[s]ß0;
(2)迭代求解:反覆對邊集e中的每條邊進行鬆弛操作,使得頂點集v中的每個頂點v的最短距離估計值逐步逼近其最短距離;
(3)檢驗負權迴路:判斷邊集e中的每一條邊的兩個端點是否收斂。如果存在未收斂的頂點,則演算法返回false,表明問題無解;否則演算法返回true,並且從源點可達的頂點v的最短距離儲存在dis[v]中。
【程式】
12const
3 maxn=100
;4 maxe=maxn*(maxn-1)div2;
5type
6 edge=record
7a,b,w :integer;
8end;9
var10 edges :array[1..maxe]of
edge;
11 dis :array[1..maxn]of
integer;
12 pre :array[1..maxn]of
integer;
13e,n,s :integer;
14procedure
init;
15var
16i :integer;
17begin
18 e:=0
;19 assign(input,'
g.in
');reset(input);
20readln(n,s);
21while
not eof do
22begin
23inc(e);
24with edges[e] do
readln(a,b,w);
25end
;26 fillchar(dis,sizeof(dis),$7f);//初始值為無窮大
27 dis[s]:=0;pre[s]:=s;
28end;29
procedure
relax(u,v,w:integer);
30begin
31if dis[u]+wthen
32begin
33 dis[v]:=dis[u]+w;
34 pre[v]:=u;
35end
36end;37
function
bellman_ford:boolean;
38var
39i,j :integer;
40begin
41for i:=1
to n-1
do42
for j:=1
to e do
43with edges[j] do
relax(a,b,w);
44for i:=1
to e do
45with edges[i] do
46if dis[a]+wthen
exit(false);
47exit(true)
48end;49
procedure
print_path(i:integer);
50begin
51if pre[i]<>s then
print_path(pre[i]);
52 write('
-->
',i)
53end;54
procedure
show;
55var
56i :integer;
57begin
58for i:=1
to n do
59begin
60 write(i:3,'
:',dis[i]:3,':'
,s);
61print_path(i);
62writeln
63end;64
end;
6566
begin
67init;
68if bellman_ford then
show
69else writeln('
error!!')
70end.
---恢復內容結束---
Bellman Ford演算法,SPFA演算法
bellman ford 演算法能在更普遍的情況下 存在負權邊 解決單源點最短路徑問題。對於給定的帶權 有向或無向 圖g v,e 其源點為 s,加權函式w是 邊集e 的對映。對圖g執行 bellman ford 演算法的結果是乙個布林值,表明圖中是否存在著乙個從源點s 可達的負權迴路。若不存在這樣的...
Bellman ford 演算法詳解
昨天說的dijkstra固然很好用,但是卻解決不了負權邊,想要解決這個問題,就要用到bellman ford.我個人認為bellman ford比dijkstra要好理解一些,還是先上資料 有向圖 5 712 8135 23 6 5 4 324 735 2 45 3 在講述開,先設幾個陣列 orig...
Bellman Ford演算法 模板
如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出格式 一行,包含n個用空格分隔的整數,其中第i個整數表示從...