Dijkstra算法简介
效果:求解单源最短路问题
效率:O(n2)
构图:用于保存到源点的距离的dist[], 用于记录某一个点是否已经被求解完毕的vis[],以及用于记录两点间距离的dist[][]邻接矩阵。
思路:
求解N遍:
找出距源点最近的点,作为一次答案(贪心)
利用这个点更新其他的所有未被求解的点的最短距离
缺点:
效率低下,存在大量不必要的操作,占用空间大;
更好的算法: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 }
原文:http://www.cnblogs.com/SinTASO/p/4972763.html