Bellman Ford貝爾曼福特演算法實現

2021-06-21 09:08:27 字數 2096 閱讀 9169

作為一種單源最短路徑演算法,bellman-ford對於有向圖和無向圖都能適用,它還有乙個

dijkstra演算法無法

具備的特點,那就是對含負權圖的最短路徑搜尋。

每i輪對邊的遍歷之後,只要不存在負權迴路,bellman-ford演算法都

可以保證獲得距離源點i條邊的點的最短路徑。因為最短路徑的最大長度不會超過n條邊,n為節點的數目。所以n次遍歷後所有的節點必定都能找到最短路徑。如果n次後還可以繼續鬆弛,則表明該圖存在負權迴路,可以對**稍作修改來計算負權環的大小,此處不再做說明。

bellman-ford

演算法的流程如下:

給定圖g(v, e)

(其中v、e

分別為圖

g的頂點集與邊集),源點

s,陣列distant[i]

記錄從源點

s到頂點

i的路徑長度,初始化陣列

distant[n]

為, distant[s]為0

;以下操作迴圈執行至多n-1次,n

為頂點數:

對於每一條邊e(u, v)

,如果distant[u] + w(u, v) < distant[v]

,則另distant[v] = distant[u]+w(u, v)

。w(u, v)

為邊e(u,v)

的權值;

若上述操作沒有對distant

進行更新,說明最短路徑已經查詢完畢,或者部分點不可達,跳出迴圈。否則執行下次迴圈;

為了檢測圖中是否存在負環路,即權值之和小於0

的環路。對於每一條邊

e(u, v)

,如果存在

distant[u] + w(u, v) < distant[v]

的邊,則圖中存在負環路,即是說改圖無法求出單源最短路徑。否則陣列

distant[n]

中記錄的就是源點

s到各頂點的最短路徑長度。

可知,bellman-ford演算法尋找單源最短路徑的時間複雜度為o(v*e).

/*

*貝爾曼福特演算法-解決單元最短路徑問題

*對於帶負權的情況同樣適用

*通過鬆弛操作來進行長度縮短

*/#includeusing namespace std;

#define inidis 88888888 //初始各個點到起始點的距離

struct edge //邊的結構體,包括起始點和目的點以及邊的權值

;int *distance = null; //各個點到起始點的距離

int *pre = null; //定義某個路徑上某個點的前乙個點的編號

//主題演算法函式,引數為邊資訊,邊數目,點數目,起始點

int bellman_ford(edge *edgeinfo, int nedgenum,int nnodenum, int startpoint)

//初始化所有節點到初始節點的距離

memset(distance, inidis, 2*nnodenum*sizeof(int));

distance[startpoint] = 0;

for (int i = 1; i< nnodenum+1; i++)

}} for (int k =1; k< nnodenum+1; k++) }

return 0;

}//列印源點到各個點的資訊

void printroad(int nnodenum)

flag = bellman_ford(pedgeinfo, edgenum,nodenum, startpoint);

if (flag == -1)

{ cout<<"初始化失敗"<

4 6 1

1 2 20

1 3 5

4 1 -200

2 4 4

4 2 4

3 4 2

和:4 6 1

1 2 2

1 3 5

4 1 10

2 4 4

4 2 4

3 4 2

貝爾曼方程(Bellman Equation)

貝爾曼方程 bellman equation 也被稱作動態規劃方程 dynamic programming equation 由理查 貝爾曼 richard bellman 發現,由於其中運用了變分法思想,又被稱之為現代變分法。貝爾曼方程 bellman equation 也被稱作動態規劃方程 dy...

貝爾曼方程 Bellman Equation

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!貝爾曼方程 bellman equation 也被稱作動態規劃方程 dynamic programming equation 由理查 貝爾曼 richard bellman 發現,由於其中運用了變分法思想,又被稱之為現代變分法。貝爾曼方程 bell...

貝爾曼方程(Bellman Equation)

分享一下我老師大神的人工智慧教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!貝爾曼方程 bellman equation 也被稱作動態規劃方程 dynamic programming equation 由理查 貝爾曼 richard bellman 發現,由於其中...