迪傑斯特拉 Dijkstra

2021-09-12 01:12:54 字數 2063 閱讀 9687

參考:

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

它的主要特點是以起始點為中心向外層層擴充套件(廣度優先搜尋思想),直到擴充套件到終點為止。

大概就是這樣乙個有權圖,dijkstra演算法可以計算任意節點其他節點的最短路徑

演算法思路

指定乙個節點,例如我們要計算 'a' 到其他節點的最短路徑

引入兩個集合(s、u),s集合包含已求出的最短路徑的點(以及相應的最短長度),u集合包含未求出最短路徑的點(以及a到該點的路徑,注意 如上圖所示,a->c由於沒有直接相連 初始時為∞

初始化兩個集合,s集合初始時 只有當前要計算的節點,a->a = 0

u集合初始時為a->b = 4, a->c = ∞, a->d = 2, a->e = ∞敲黑板!!!接下來要進行核心兩步驟了從u集合中找出路徑最短的點,加入s集合,例如a->d = 2更新u集合路徑,if ( 'd 到 b,c,e 的距離' + 'ad 距離' < 'a 到 b,c,e 的距離' )則更新u

迴圈執行 4、5 兩步驟,直至遍歷結束,得到a 到其他節點的最短路徑

演算法**

1.選定a節點並初始化,如上述步驟3所示

2.執行上述 4、5兩步驟,找出u集合中路徑最短的節點d 加入s集合,並根據條件if ( 'd 到 b,c,e 的距離' + 'ad 距離' < 'a 到 b,c,e 的距離' )來更新u集合

3.這時候a->b, a->c都為3,沒關係。其實這時候他倆都是最短距離,如果從演算法邏輯來講的話,會先取到b點。而這個時候 if 條件變成了if ( 'b 到 c,e 的距離' + 'ab 距離' < 'a 到 c,e 的距離' )如圖所示這時候a->b距離 其實為a->d->b

思路就是這樣,往後就是大同小異了

演算法結束

#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代表點數

int main()

for( i=1; i<=n; i++)

d[i]=max1;

d[1]=0;

for(i=1;i<=n;i++)

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

for(i=1;i",d[i]);

printf("%d\n",d[n]); 

return 0;

}

Dijkstra 迪傑斯特拉

1 演算法思想 設g v,e 是乙個帶權有向圖,把圖中頂點集合v分成兩組 第一組為已求出最短路徑的頂點集合 用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 就將加入到 集合s中,直到全部頂點都加入到s中,演算法就結束了 第二組為其餘未確定最短路徑的頂點集合 用u表示 按最短路徑長度的遞增次...

Dijkstra(迪傑斯特拉)演算法

迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...

迪傑斯特拉 dijkstra 筆記

dijkstra演算法是用來解決有權圖 無負權 中的最短路問題。過程 首先我們初始化乙個陣列dis tdist dist 將其所有值初始化為無窮,dis t i dist i dist i 表示到i ii點的最短距離。然後我們把所有的節點分到兩個集合s與v中,s集合表示已確定最短路的節點的集合,v表...