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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构----单源最短路径Dijkstra

發布時間:2023/12/4 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构----单源最短路径Dijkstra 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構----單源最短路徑Dijkstra



原理:參考趣學數據結構



代碼:


stack.h 棧代碼


#pragma once #include<stdio.h> #define maxSize 100 typedef struct stack {int * base;int * top; }stack; bool init(stack & Stack) {//棧的初始化Stack.base = new int[maxSize];if (!Stack.base) {return false;}Stack.top = Stack.base;return true; } bool push(stack & Stack,int e) {//入棧if (Stack.top - Stack.base == maxSize) {//滿棧,不能再插入return false;}*(Stack.top) = e;Stack.top++;return true; } bool pop(stack & Stack, int &e) {//出棧if (Stack.base == Stack.top) {//棧空return false;}Stack.top--;e = *(Stack.top);return true; } int getTop(stack &Stack) {if (Stack.base == Stack.top) {//棧空return -1;}return *(Stack.top - 1); } void printStack(stack Stack) {//遍歷棧中的元素while (Stack.base != Stack.top) {printf("%d ", *(Stack.top - 1));Stack.top--;} } bool empty(stack Stack) {//棧空的判斷if (Stack.base == Stack.top) {return true;}return false; } void testStack() {//測試棧是否有問題stack Stack;init(Stack);int value;while (1) {scanf_s("%d", &value);if (value == -1) {break;}push(Stack, value);}printStack(Stack); }

dijkstra.cpp


#include<stdio.h> #include<stdlib.h> #include"stack.h" #define N 100 #define elemType int //const int MAX_INT = (1 << 31) - 1; //const int MAX_INT = 0X7fffffff; #define INF (((unsigned int)(-1)) >> 1) typedef struct GraphMatrix {elemType vNode[N][N];int vNum, eNum; }GraphMatrix; void findPath(GraphMatrix G, int dist[], int p[], int u, stack &Stack);//聲明 void initGMaxtix(GraphMatrix &G) {//初始化鄰接矩陣printf("輸入頂點數和邊數\n");scanf_s("%d%d", &G.vNum, &G.eNum);for (int i = 0; i < G.vNum; i++) {//初始化鄰接矩陣for (int j = 0; j < G.vNum; j++) {G.vNode[i][j] = G.vNode[j][i]=INF;}}printf("輸入頂點v1到頂點v2和其邊的權重\n");for (int i = 0; i < G.eNum; i++ ) {int v1, v2,weights;scanf_s("%d%d%d", &v1, &v2,&weights);G.vNode[v1][v2] = G.vNode[v2][v1] = weights;} } void print4(GraphMatrix G) {printf("鄰接矩陣如下:\n");for (int i = 0; i < G.vNum; i++) {for (int j = 0; j < G.vNum; j++) {printf("%d ", G.vNode[i][j]);}printf("\n");} } void print41(int result[], int length) {for (int i = 0; i < length; i++) {printf("%d ", result[i]);}printf("\n"); } void Dijkstra(GraphMatrix G, int u) {//單源最短路徑,分為兩個集合求解bool flag[N];//標識是否加入第一個頂點集int dist[N], p[N];//分別為單源點到其他點的距離和這段距離所經過的那些頂點的記錄數組pp[u] = -1;dist[u] = 0;for (int i = 0; i < G.vNum; i++) {flag[i] = false;//每一個頂點都默認沒有訪問dist[i] = G.vNode[u][i];if (G.vNode[u][i]==INF) {//對距離數組和記錄數組初始化p[i] = -1;}else {p[i] = u;}}flag[u] = true;for (int i = 0; i < G.vNum - 1; i++) {//G.vNum-1次連接//找沒有被訪問的最小元素int min=INF;int t=u;for (int j = 0; j < G.vNum; j++) {if (!flag[j] && dist[j] < min) {t = j;min = dist[j];}}if (t == u) {break;//全部頂點加入到第一個頂點集合中}flag[t] = true;//加入到第一個頂點集合中//更新距離數組for (int j = 0; j < G.vNum; j++) {if (!flag[j] && dist[t] + G.vNode[t][j] < dist[j]) {dist[j] = dist[t] + G.vNode[t][j];p[j] = t;}}}//print41(dist, G.vNum);stack Stack;init(Stack);printf("輸出單源最短路徑的最優方案\n");findPath(G, dist, p, u, Stack); } void findPath(GraphMatrix G,int dist[], int p[],int u,stack &Stack) {for (int i = 0; i < G.vNum; i++) {if (p[i]==-1) {//起點到起點printf("%d---%d不可達!\n",u,i);continue;}push(Stack, i);int x = p[i];while (x != -1) {//入棧查找路徑push(Stack, x);x = p[x];}int e;while (!empty(Stack)) {//出棧遍歷路徑printf("%d", getTop(Stack));pop(Stack, e);if (Stack.top - Stack.base >= 1) {printf("---");}}printf(" 這段路徑的距離為:%d\n", dist[i]);} } int main() {GraphMatrix G;initGMaxtix(G);print4(G);printf("\n");Dijkstra(G,0);system("pause");return 0; }

測試截圖:

時間復雜度為O(n),空間復雜度為O(n)!

如果存在什么問題,歡迎批評指正!謝謝!

總結

以上是生活随笔為你收集整理的数据结构----单源最短路径Dijkstra的全部內容,希望文章能夠幫你解決所遇到的問題。

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