迪傑斯特拉最短路徑演算法

2021-08-28 11:18:10 字數 1428 閱讀 3209

時間限制: 1 sec  記憶體限制: 32 mb

提交: 27  解決: 17

[提交] [狀態] [命題人:外部匯入]

題目描述

在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。

在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的次序產生最短路徑的演算法。

在本題中,讀入乙個有向圖的帶權鄰接矩陣(即陣列表示),建立有向圖並按照以上描述中的演算法求出源點至每乙個其它頂點的最短路徑長度。

輸入輸入的第一行包含2個正整數n和s,表示圖中共有n個頂點,且源點為s。其中n不超過50,s小於n。

以後的n行中每行有n個用空格隔開的整數。對於第i行的第j個整數,如果大於0,則表示第i個頂點有指向第j個頂點的有向邊,且權值為對應的整數值;如果這個整數為0,則表示沒有i指向j的有向邊。當i和j相等的時候,保證對應的整數為0。

輸出只有一行,共有n-1個整數,表示源點至其它每乙個頂點的最短路徑長度。如果不存在從源點至相應頂點的路徑,輸出-1。

請注意行尾輸出換行。

樣例輸入

4 1

0 3 0 1

0 0 4 0

2 0 0 0

0 0 1 0

樣例輸出

6 4 7
提示

在本題中,需要按照題目描述中的演算法完成迪傑斯特拉演算法,並在計算最短路徑的過程中將每個頂點是否可達記錄下來,直到求出每個可達頂點的最短路徑之後,演算法才能夠結束。

迪傑斯特拉演算法的特點是按照路徑長度遞增的順序,依次新增下一條長度最短的邊,從而不斷構造出相應頂點的最短路徑。

另外需要注意的是,在本題中為了更方便的表示頂點間的不可達狀態,可以使用乙個十分大的值作為標記。

[提交][狀態]

**:

#includeint e[60][60];

int inf=9999999;

int main()

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

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

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

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

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

if(e[i][j]>e[i][k]+e[k][j])

e[i][j]=e[i][k]+e[k][j];

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

printf("\n");

} printf("\n");

return 0;

}

核心**:

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

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

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

if(e[i][j]>e[i][k]+e[k][j])

e[i][j]=e[i][k]+e[k][j];

最短路徑 迪傑斯特拉演算法

例如,要求下圖v0到v8的最短路徑 所以我們可以找到這樣的一條最短路徑 下面是他的鄰接矩陣 偽 如下 define maxvex 9 define infinity 65535 typedef int patharc maxvex 用於儲存最短路徑下標的陣列 typedef int shortpat...

最短路徑(迪傑斯特拉演算法)

源 include define maxint 32767 表示極大值 define mvnum 100 最大頂點數 typedef char vertextype 定義資料型別 typedef int arctype typedef struct amgraph int locatevex amg...

迪傑斯特拉最短路徑

問題描述 在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的次序產生最短路徑的演算法。在本題中,讀入乙個有向圖的帶權鄰接矩陣 即陣列表示 建立有向圖並按照以上描...