使用Dijkstra演算法求最短路徑

2021-10-03 15:48:53 字數 1399 閱讀 8845

dijkstra演算法:

1.通過dijkstra計算圖g中的最短路徑時,需要指定起點s(即從頂點s開始計算)。

2.此外,引進兩個集合s和u。s的作用是記錄已求出最短路徑的頂點(以及相應的最短路徑長度),而u則是記錄還未求出最短路徑的頂點(以及該頂點到起點s的距離)。

3.初始時,s中只有起點s;u中是除s之外的頂點,並且u中頂點的路徑是」起點s到該頂點的路徑」。然後,從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。 然後,再從u中找出路徑最短的頂點,並將其加入到s中;接著,更新u中的頂點和頂點對應的路徑。重複該操作,直到遍歷完所有頂點。

#include

#include

#define max1 10000000

int a[

1000][

1000];

int d[

1000];

//d表示源節點到該節點的最小距離

int p[

1000];

//p標記訪問過的節點

int i, j, k;

int m;

//m代表邊數

int n;

//n代表點數

intmain()

for(i =

1; i <= n; i++

) d[i]

= max1;

d[1]

=0;for

(i =

1; i <= n; i++

)//p[k]=d[k]; // 這是原來的**,用下一 條**替代。初始時,執行到這裡k=1,而d[1]=0

//從而p[1]等於0,這樣的話,上面的迴圈在之後的每次執行之後,k還是等於1。

p[k]=1

;//置1表示第k個節點已經訪問過了

for(j =

1; j <= n; j++)if

(a[k]

[j]!=0&&

!p[j]

&& d[j]

> d[k]

+ a[k]

[j])

d[j]

= d[k]

+ a[k]

[j];

}//最終輸出從源節點到其他每個節點的最小距離

for(i =

1; i < n; i++

)printf

("%d->"

, d[i]);

printf

("%d\n"

, d[n]);

return0;

}

dijkstra演算法:

時間複雜度:o(n^2)

dijkstra演算法求最短路

演算法思想 用乙個dis陣列記錄源點到其他各點的路徑,例如 如果v0是源點,那麼dis 1 就表示v0到v1的最短距離 用乙個vis陣列記錄頂點有沒有被當成出發點。如果第乙個出發點 源點 到別的點的路都已經走完了,那就找一下個目前距離源點最近的點作為出發點,標誌為1。然後繼續尋找最短路徑,如果dis...

Dijkstra演算法求最短路徑

參考文獻 dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用open,close表方式,drew為了和下面要介紹的 a 演算法和 d 演算法表述一致,這裡均採用open,close表的方式。大概過程 建立兩個表,open,close。open表儲存所有已生成而未考察的節點,...

Dijkstra演算法求最短路徑

dijkstra演算法用來求最短距離 已經實現了 那麼最短路徑 如何求解並列印出來呢?此處的方法是記錄路徑中結點的前驅 if v未被訪問 以u為中介點可以使起點s到頂點v的最短距離d v 更優 程式具體實現,鄰接矩陣版 n為頂點數,maxv為最大頂點數 int n,g maxv maxv 起點到達各...