日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

图的最短路径之Dijkstra求单源最短路径算法(C++)

發布時間:2024/5/14 c/c++ 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的最短路径之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++)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。