Dijkstra算法在C++語言下的實現

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 }
相關文章
相關標籤/搜索