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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

Dijkstra算法的c++实现

發布時間:2025/6/15 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dijkstra算法的c++实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Dijkstra算法的c++實現

Dijkstra算法:
1 Dijkstra算法解決帶權圖的單源最短路徑問題,權值要不小于0。
2 頂點集合S,保存已經找到的從源點s找到的頂點。
3 頂點集合V,保存剩下的節點,最小優先隊列Q,存儲V中節點。
4 使用最小優先隊列,尋找下一個頂點距離最近的節點u,然后使用w(s,u)來松弛u的鄰接點v。
===================================================================

View Code 1 //prev[],dist[],distance[][] 2 #include<iostream> 3 #include<stdio.h> 4 #include<limits.h> 5 using namespace std; 6 const int MAX = 100; 7 int c[MAX][MAX]; 8 int dist[MAX]; 9 int prev[MAX]; 10 int S[MAX]; 11 void dijkstra(int s,int n,int dist[],int prev[],int c[][MAX]) 12 { 13 for(int i = 1; i <= n; i++)//數組下標都從1開始 14 { 15 dist[i] = c[s][i]; 16 S[i] = 0;//0代表,i不再S集合中 17 if(i != s && dist[i] < INT_MAX) 18 prev[i] = s;//i的前一個節點 19 else 20 prev[i] = -1;//prev數組初始化 21 } 22 S[s] = 1;//源點s放在結合S中 23 //選擇不在S集合中的具有最短距離的頂點u 24 int u; 25 for(int i = 1; i < n; i++) 26 { 27 int mindis = INT_MAX; 28 for(int j = 1; j <= n; j++) 29 { 30 if(!S[j] && dist[j] < mindis) 31 { 32 u = j; 33 mindis = dist[j]; 34 } 35 } 36 S[u] = 1; 37 for(int k = 1; k <= n; k++) 38 { 39 if(!S[k] && c[u][k] < INT_MAX && dist[u] + c[u][k] < dist[k]) 40 { 41 dist[k] = dist[u] + c[u][k]; 42 prev[k] = u; 43 } 44 } 45 } 46 } 47 int main() 48 { 49 freopen("graph.txt","r",stdin); 50 int line,numberVertex; 51 cin >> numberVertex >> line; 52 //init c[][] 53 for(int i = 1; i <= numberVertex; i++) 54 for(int j = 1; j <= numberVertex; j++) 55 if(i != j) 56 c[i][j] = INT_MAX; 57 //c[][]對角線上為0 58 int p,q,len; 59 for(int i = 1; i <= line; i++) 60 { 61 cin >> p >> q >> len; 62 if(len < c[p][q]) 63 c[p][q] = len; 64 } 65 for(int i =1; i <= numberVertex; i++) 66 { 67 for(int j = 1; j <= numberVertex; j++) 68 cout << c[i][j] << " "; 69 cout << endl; 70 } 71 //init dist[] 72 for(int i = 1; i <= numberVertex; i++) 73 dist[i] = INT_MAX; 74 dijkstra(1,numberVertex,dist,prev,c); 75 cout << dist[numberVertex] << endl; 76 return 0; 77 }

?1 dist[v]保存的是從源點到這個點的最短距離;

?2 prev[v]保存的是從源點到這個點的最短路徑中,這個點的前一個節點

?3 c[][]存儲的是頂點之間的權值

?

posted on 2013-05-04 16:44 T000ny 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/majianbin/archive/2013/05/04/3059630.html

總結

以上是生活随笔為你收集整理的Dijkstra算法的c++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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