資料結構之最短路徑問題

2021-08-19 15:53:26 字數 3321 閱讀 9353

1. 定義概覽

dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。

主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。注意該演算法要求圖中不存在負權邊。

問題描述:在無向圖g=

(v,e

) g=(

v,e)

中,假設每條邊 e[

i]e [i

]的長度為 w[

i]w [i

],找到由頂點 v0

v

0到其餘各點的最短路徑。(單源最短路徑)

2.演算法描述

演算法思想 :設g

=(v,e)g

=(v,

e)是乙個帶權有向圖,把圖中頂點集合v分成兩組,第一組為已求出最短路徑的頂點集合(用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 , 就將加入到集合s中,直到全部頂點都加入到s中,演算法就結束了),第二組為其餘未確定最短路徑的頂點集合(用u表示),按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度。此外,每個頂點對應乙個距離,s中的頂點的距離就是從v到此頂點的最短路徑長度,u中的頂點的距離,是從v到此頂點只包括s中的頂點為中間頂點的當前最短路徑長度。

演算法步驟 :

a. 初始時,s只包含源點,即s=

s

=,v的距離為0。u包含除v外的其他頂點,即:u=,若v與u中頂點u有邊,則

v>

v>

正常有權值,若u不是v的出邊鄰接點,則

v>

v>

權值為 ∞∞

b. 從u中選取乙個距離v最小的頂點k,把k,加入s中(該選定的距離就是v到k的最短路徑長度)。

c. 以k為新考慮的中間點,修改u中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。

d. 重複步驟b和c直到所有頂點都包含在s中。

3. **實現

const

int maxint = 32767;

const

int maxnum = 10;

int dist[maxnum];

int prev[maxnum];

int a[maxunm][maxnum];

void dijkstra(int v0)

dist[v0] = 0;

s[v0] = true;   

for(int i=2; i<=n; i++)

s[u] = true;

for(int j=1; j<=n; j++)

if((!s[j]) && a[u][j]if(dist[u] + a[u][j] < dist[j]) //在通過新加入的u點路徑找到離v0點更短的路徑 }}

}

1.定義概覽

floyd-warshall演算法(floyd-warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。

floyd-warshall演算法的時間複雜度為o(

n3) o(n

3),空間複雜度為o(

n2) o(n

2)2.演算法描述

floyd演算法是乙個經典的動態規劃演算法

用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋(這個詮釋正是動態規劃最富創造力的精華所在)

從任意節點i到任意節點j的最短路徑不外乎2種可能:

是直接從i到j,

是從i經過若干個節點k到j。

所以,我們假設di

s(i,

j)d is

(i,j

)為節點u到節點v的最短路徑的距離,對於每乙個節點k,我們檢查di

s(i,

k)+d

is(k,j)

s(i,

j)d is

(i,k

)+di

s(k,

j)s(i,

j)是否成立.

如果成立,證明從i到k再到j的路徑比i直接到j的路徑短,我們便設定 di

s(i,

j)=d

is(i

,k)+

dis(

k,j)

d is

(i,j

)=di

s(i,

k)+d

is(k

,j),這樣一來,當我們遍歷完所有節點k,dis(i,j)中記錄的便是i到j的最短路徑的距離。

3. **:

偽演算法:

// dist(i,j) 為從節點i到節點j的最短距離

for i←1

to n do

for j←1

to n do

dist(i,j) = weight(i,j)

for k←1

to n do

// k為「媒介節點」

for i←1

to n do

for j←1

to n do

if (dist(i,k) + dist(k,j) < dist(i,j)) then

// 是否是更短的路徑?

dist(i,j) = dist(i,k) + dist(k,j)

**實現:

typedef struct          

mgraph;

void floyd(mgraph g)

for(k=0;k

} }

資料結構之最短路徑(DijKstra)

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短路...

資料結構之最短路徑(Floyd)

floyd演算法,求網圖g中各頂點v到其餘頂點w的最短路徑p v w 及帶權長度d v w void shortestpath floyd mgraph g,patharc p,shortpathtable d 下面介紹下詳細的執行過程 1 程式開始執行,第4 11行就是初始化了d和p,使得它們成為...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...