Dijkstra算法簡介ios
效果:求解單源最短路問題算法
效率:O(n2)spa
構圖:用於保存到源點的距離的dist[], 用於記錄某一個點是否已經被求解完畢的vis[],以及用於記錄兩點間距離的dist[][]鄰接矩陣。code
思路:blog
求解N遍:it
找出距源點最近的點,做爲一次答案(貪心)io
利用這個點更新其餘的全部未被求解的點的最短距離class
缺點:效率
效率低下,存在大量沒必要要的操做,佔用空間大;stream
更好的算法:SPFA算法:O(nlgn);
1 #include <iostream> 2 #include <cstdio> 3 #define MAXN 1000 4 #define MAXINT 299999999 5 6 using namespace std; 7 8 struct Grauph{ 9 int dist[MAXN+10], pre[MAXN+10]; 10 bool vis[MAXN+10]; 11 int A[MAXN+10][MAXN+10]; 12 }; 13 Grauph G; 14 int n,m; 15 16 void init(Grauph &G,int n, int m ){ 17 for(int i=0; i<=n; ++ i){ 18 G.dist[i] = MAXINT; 19 G.vis[i] = 1; 20 G.pre[i] = i; 21 for(int j=0;j<=n;++ j) G.A[i][j] = MAXINT; 22 } 23 } 24 void Dijkstra(Grauph &G, int s, int n){ 25 G.dist[s] = 0; 26 for(int i=0; i<n; ++ i){ 27 int k=0; 28 for(int j=1; j<=n; ++ j) 29 if(G.vis[j] && G.dist[j]<G.dist[k]) k = j; 30 G.vis[k] = 0; 31 for(int j=1; j<=n; ++ j) 32 if(G.vis[j] && G.dist[k]+G.A[k][j]<G.dist[j]){ 33 G.dist[j] = G.dist[k] + G.A[k][j]; 34 G.pre[j] = k; 35 } 36 } 37 } 38 void dfs(int n){ 39 if(G.pre[n]==n){ 40 printf("%d", n); 41 return; 42 } 43 dfs(G.pre[n]); 44 printf(" -> %d",n); 45 return; 46 } 47 int main(int argc, char** argv) { 48 scanf("%d %d", &n, &m); 49 init(G, n, m); 50 for(int i=0, x, y, w; i<m; ++i){ 51 scanf("%d %d %d", &x, &y, &w); 52 if(w<G.A[x][y]){ 53 G.A[x][y] = w; 54 G.A[y][x] = w; 55 } 56 } 57 int s = 1; 58 Dijkstra(G, s, n); 59 printf("length(%d -> %d) : %d \n", s, n, G.dist[n]); 60 dfs(n); 61 return 0; 62 }