首先,我們講一下迪傑斯特拉演算法的原理:
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...