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 */

 

posted on 2020-02-16 10:11  带你AK,带你飞  阅读(147)  评论(0编辑  收藏  举报