迪傑斯特拉演算法求解最短路徑(三) 《動態規劃》

2021-08-08 12:47:04 字數 1777 閱讀 2630

首先,我們講一下迪傑斯特拉演算法的原理:

1)首先設乙個集合為t=空集,s=;

2)從s中選擇距離t集合中的點距離最近的未被選中的點w,並將其加入t集合中;

3)用剛剛選中的w節點更新源點v0到其他節點的距離;

4)重複2)、3)步驟,直至所有的節點都已經加入到t集合中。

注意上述的描述方案中,我們將乙個點v距離自己的距離設定為0,如果設定為無窮大,則相應的描述需要進行相應的調整,即**上也需要進行相應的調整,大家可以對比兩份**觀察其中的區別:

為了理解迪傑斯特拉演算法丘最短路徑的抽象概念,我們這裡舉了乙個例子,進行說明:

針對上述例子,我們編寫如下**進行求解:

**一:

#include 

#include

using

namespace

std;

#define max 100000

#define n 6

#define v0 0

int arcs[n][n] = ;

bool final[n];

int dijstera()

else

final[i] = false;

}*/for (int i = 0; i < n; i++)}}

cout

<< flag << " ";

final[flag] = true;

for (int v = 0; v < n; v++)}}

cout

<< endl;

return arcs[v0][n - 1];

}int main()

執行結果:

**二:

#include 

#include

using namespace std;

#define max

100000

#define n

6#define v0 0

int arcs[n][n] = ;

bool final[n];

int dijstera()

else

final[i] = false;

}*/for (int i = 0; i < n; i++)}}

cout << flag << " ";

final[flag] = true;

for (int v = 0; v < n; v++)}}

cout << endl;

return arcs[v0][n - 1];

}int main()

執行結果:

注意,**二中的執行結果並沒有達到我們預期的設計思路,因此我們可以進行**的相關修改哈!

ps:

各位可以注意一下**一和**二輸出的結果,觀察其中的結果然後分析其為什麼給出的答案不一致,然後可以思考一下如何解決這種問題,提示,解決問題的方法在上面**中已經給出來了,希望大家仔細檢視**啦!!!

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

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

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

時間限制 1 sec 記憶體限制 32 mb 提交 27 解決 17 提交 狀態 命題人 外部匯入 題目描述 在帶權有向圖g中,給定乙個源點v,求從v到g中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的...

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

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