1 // Dijkstra算法,适用于没有负边的情况 2 // 注意:是没有负边,不是没有负环 3 // 在这一条件下,可以将算法进行优化 4 // 从O(v*E)的复杂度,到O(V^2)或者是O(E*log(V)) 5 // 现在我们来看第一种O(V^2)的实现 6 7 #include <cstdio> 8 #include <iostream> 9 10 using namespace std; 11 12 const int max_N = 1000+2; 13 const int max_E = 10000+2; 14 const int INF = 1e9; 15 // 这是一种很简单的实现方法 16 // 图用临接矩阵来存储即可 17 int cost[max_N][max_N]; 18 int d[max_N]; 19 bool used[max_N]; 20 int N,E; 21 22 void dijkstra(int s) 23 { 24 fill(d,d+N,INF); 25 fill(used,used+N,false); 26 d[s]=0; 27 28 while(true) 29 { 30 int v=-1; 31 for(int i=0;i<N;++i) 32 { 33 if(!used[i] && (v==-1 || d[i]<d[v])) 34 { 35 v=i; 36 } 37 } 38 39 if(v==-1) 40 { 41 break; 42 } 43 used[v]=true; 44 for(int i=0;i<N;++i) 45 { 46 if(d[i]>d[v]+cost[v][i]) 47 { 48 d[i]=d[v]+cost[v][i]; 49 } 50 } 51 } 52 } 53 54 int main() 55 { 56 scanf("%d %d",&N,&E); 57 int a,b,c; 58 for(int i=0;i<=N;++i) 59 { 60 for(int j=0;j<=N;++j) 61 { 62 cost[i][j]=INF; 63 } 64 } 65 for(int i=0;i<E;++i) 66 { 67 scanf("%d %d %d",&a,&b,&c); 68 cost[a][b]=c; 69 cost[b][a]=c; 70 } 71 72 dijkstra(0); 73 74 for(int i=0;i<N;++i) 75 { 76 printf("%d ",d[i]); 77 } 78 return 0; 79 } 80 81 82 /* 83 7 10 84 0 1 2 85 0 2 5 86 1 2 4 87 1 3 6 88 1 4 10 89 2 3 2 90 3 5 1 91 4 5 3 92 4 6 5 93 5 6 9 94 95 */