Bellman Ford演算法思想

2022-07-17 04:33:10 字數 2411 閱讀 7298

---恢復內容開始---

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]中。

【程式】

1

2const

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個整數表示從...