图的最短路径之Dijkstra求单源最短路径算法(C++)
生活随笔
收集整理的這篇文章主要介紹了
图的最短路径之Dijkstra求单源最短路径算法(C++)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一個(gè)有向帶權(quán)圖求它的單源最短路徑可以使用Dijkstra算法。
單源最短路徑是指:從圖中的某個(gè)頂點(diǎn)出發(fā),到其余各個(gè)頂點(diǎn)權(quán)值最小的路徑。
Dijkstra算法需要用到三個(gè)輔助數(shù)組:
- dist[max]:記錄當(dāng)前出發(fā)點(diǎn)v到其余各個(gè)點(diǎn)的最短權(quán)值之和(包括自己,為0);
- path[max]:記錄當(dāng)前每個(gè)結(jié)點(diǎn)在最短權(quán)值路徑的狀態(tài)下的前驅(qū)結(jié)點(diǎn);
- s[max]:記錄當(dāng)前狀態(tài)下的每個(gè)結(jié)點(diǎn)是否被訪問(wèn)過(guò),訪問(wèn)過(guò)為1,沒(méi)訪問(wèn)為0;
(max為圖的頂點(diǎn)數(shù))
Dijkstra算法由于要不斷地訪問(wèn)頂點(diǎn)之間的邊的信息,所以更適合將圖用鄰接矩陣進(jìn)行存儲(chǔ)。
本文關(guān)于Dijkstra算法的思想就不再贅述,主要是分享Dijkstra算法的代碼實(shí)現(xiàn)。
算法的核心代碼:
void Dijkstra(Mgraph G,int v) {int num = 0;int min = 0;int s[MAX];int dist[MAX];int path[MAX];for (int i = 0; i < G.vexnum; i++){dist[i] = G.arc[v][i];if (dist[i] != INF) path[i] = v;else path[i] = -1;}for (int i = 0; i < G.vexnum; i++){s[i] = 0;}s[v] = 1;num = 1;//在未訪問(wèn)的結(jié)點(diǎn)中更新dist和path數(shù)組以及s數(shù)組while (num < G.vexnum){min = FindMinDist(dist, s, G); //尋找最小的權(quán)值結(jié)點(diǎn)s[min] = 1;for (int i = 0; i < G.vexnum; i++){if (s[i] == 0 && (dist[i] > dist[min] + G.arc[min][i])){dist[i] = dist[min] + G.arc[min][i];path[i] = min;}}num++;}//打印輸出結(jié)果:for (int i = 0; i < G.vexnum; i++){cout << dist[i] << " ";}cout << endl;for (int i = 0; i < G.vexnum; i++){cout << path[i] << " ";} }完整代碼:
?
執(zhí)行結(jié)果:
?
?
總結(jié)
以上是生活随笔為你收集整理的图的最短路径之Dijkstra求单源最短路径算法(C++)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阿里云服务器入门教程汇总,从理论到实践
- 下一篇: C++基础之成员变量的秘密