生活随笔
收集整理的這篇文章主要介紹了
图的最短路径之Dijkstra求单源最短路径算法(C++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個有向帶權圖求它的單源最短路徑可以使用Dijkstra算法。
單源最短路徑是指:從圖中的某個頂點出發,到其余各個頂點權值最小的路徑。
Dijkstra算法需要用到三個輔助數組:
- dist[max]:記錄當前出發點v到其余各個點的最短權值之和(包括自己,為0);
- path[max]:記錄當前每個結點在最短權值路徑的狀態下的前驅結點;
- s[max]:記錄當前狀態下的每個結點是否被訪問過,訪問過為1,沒訪問為0;
(max為圖的頂點數)
Dijkstra算法由于要不斷地訪問頂點之間的邊的信息,所以更適合將圖用鄰接矩陣進行存儲。
本文關于Dijkstra算法的思想就不再贅述,主要是分享Dijkstra算法的代碼實現。
算法的核心代碼:
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;//在未訪問的結點中更新dist和path數組以及s數組while (num < G.vexnum){min = FindMinDist(dist, s, G); //尋找最小的權值結點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++;}//打印輸出結果:for (int i = 0; i < G.vexnum; i++){cout << dist[i] << " ";}cout << endl;for (int i = 0; i < G.vexnum; i++){cout << path[i] << " ";}
}
完整代碼:
?
#include<iostream>
using namespace std;
#define MAX 9
#define INF 9999
typedef struct Mgraph {char Vexnum[MAX]; //圖的頂點信息int arc[MAX][MAX];//二維數組存儲頂點之間的邊的權值信息int vexnum;//圖的頂點數int edgenum;//圖的邊數
};
//創建圖
void CreatM(Mgraph& G)
{int i, j, w;cout << "請輸入圖的頂點數和邊數" << endl;cin >> G.vexnum >> G.edgenum;cout << "請輸入頂點信息" << endl;for (int i = 0; i < G.vexnum; i++){cin >> G.Vexnum[i];}//初始化二維數組的邊的權值為INFfor (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){if(i == j) G.arc[i][j] = 0;else G.arc[i][j] = INF;}}//更改二維數組中邊的權值為輸入進來的權值for (int k = 0; k < G.edgenum; k++){cout << "請輸入邊(Vi,Vj)的下標i,j和權重w: " << endl;cin >> i >> j >> w;G.arc[i][j] = w;}
}
void MyPrint(Mgraph G) {cout << "創建的圖的鄰接矩陣如下所示: " << endl;for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){cout << G.arc[i][j] << " ";}cout << endl;}
}
//在dist數組中找s[i] = 0,權值最小的數組下標。
int FindMinDist(int *pdist,int *s, Mgraph G) {int num = G.vexnum;int min = INF;for (int i = 0; i < num; i++){if (pdist[i] < min && s[i] == 0){min = i;}}return min;
}
//算法核心
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;while (num < G.vexnum){min = FindMinDist(dist, s, G);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++;}for (int i = 0; i < G.vexnum; i++){cout << dist[i] << " ";}cout << endl;for (int i = 0; i < G.vexnum; i++){cout << path[i] << " ";}
}
int main() {Mgraph G;CreatM(G);//MyPrint(G);Dijkstra(G,0);return 0;
}
執行結果:
?
?
總結
以上是生活随笔為你收集整理的图的最短路径之Dijkstra求单源最短路径算法(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。