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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基础算法之Dijkstra最短路径

發布時間:2024/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础算法之Dijkstra最短路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

核心思想:以起始原點為中心,想外層擴展,知道擴展到重點為止。

設到A點的最短路徑上,A點前驅節點為B,則該路徑包含到達節點B的最短路徑。

S集合代表已經探索過的節點,U集合表示未探索過的節點。

時間復雜度為O(n^2)

具體過程見下圖和表

C++代碼如下:

1 #include<stdio.h> 2 #define MAXDIS 4294967295 3 using namespace std; 4 5 class MatrixGraphic{ 6 public: 7 MatrxiGraphic(int number=0){ 8 this->vertexNum = number; 9 vertex = new int[vertexNum]; 10 arc = new int *[vertexNum]; 11 for(int i=0;i<vertexNum;i++) 12 { 13 arc[i]=new int[vertex]; 14 for(int j=0;j<vertexNum;j++) 15 { 16 arc[i][j] = MAXDIS; 17 } 18 } 19 } 20 21 int getValueOfEdge(int start,int end) 22 { 23 return arc[start][end];j 24 } 25 int getVertexNumber() 26 { 27 return vertexNum; 28 } 29 30 void setValueOfEdge(int start,int end,int value) 31 { 32 this->arc[start][end] = value; 33 } 34 private: 35 int vertexNum; 36 int *vertex; 37 int **arc; 38 } 39 40 void dijkstra(MatrixGraphic *graphic,int s,int *dist,int *prev) 41 { 42 int vertexNUm = graphic->getVertexNumber(); 43 bool *S = new bool[vertexNum]; 44 for(int i=0;i<vertexNum;i++) 45 { 46 dist[i]=graphic->getValueOfEdge(s,i); 47 S[i]=false; 48 if(dist[i]==MAXDIS) 49 { 50 prev[i]=-1; 51 } 52 else 53 { 54 prev[i]=s; 55 } 56 } 57 58 dist[s]=0; 59 S[s] = true; 60 61 for(int i=1;i<vertexNum;i++) 62 { 63 int temp = MAXDIS; 64 int u=s; 65 for(int j=0;j<vertexNum;j++) 66 { 67 if(!S[j] && dist[j]<temp) 68 { 69 u=j; 70 temp = dist[j]; 71 } 72 } 73 S[u]=true; 74 for(int j=0;j<vertexNum;j++) 75 { 76 int edge = graphic->getValueOfEdge(u,j); 77 if(!S[i] && edge<MAXDIS) 78 { 79 int newDist = dist[u]+edge; 80 if(newDist<dist[j]) 81 { 82 dist[j]=newDist; 83 prev[j]=u; 84 } 85 } 86 } 87 } 88 89 for(int i=0;i<vertexNum;i++) 90 { 91 int *stack = new int[vertexNum]; 92 int top = 0; 93 stack[top]=i; 94 top++; 95 int tempVertex = prev[i]; 96 while(tempVertex != s) 97 { 98 stack[top]=tempVertex; 99 top++; 100 tempVertex = prev[tempVertex]; 101 } 102 stack[top] = s; 103 for(int j=top;j>=0;j--) 104 { 105 if(j!=0) 106 { 107 cout<<stack[top]<<"->"; 108 } 109 else 110 { 111 cout<<stack[top]<<endl; 112 } 113 } 114 } 115 } View Code

?

轉載于:https://www.cnblogs.com/yueyanglou/p/4518534.html

總結

以上是生活随笔為你收集整理的基础算法之Dijkstra最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。

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