zrq495
www.zrq495.com

最短路.

dijkstra 算法.

代码如下:

 1 #include<iostream>
 2 #include<cstring>
 3 #define MAX 9999999
 4 
 5 using namespace std;
 6 
 7 int n, m;
 8 int map[202][202];
 9 int vis[202];    //标记是否更新  1为更新
10 int dir[202];    //到出发点的距离
11 
12 void dij(int s)
13 {
14     int i, j;
15     int pos, min;
16     memset(vis, 0, sizeof(vis));
17     for (i=0; i<=n; i++)    //初始化各边到出发点的距离
18         dir[i]=map[s][i];
19     vis[s]=1;    //标记出发点 更新
20     for (i=1; i<n; i++)    //循环n-1次  查找
21     {
22         min=MAX;
23         for (j=0; j<n; j++)  
24         {
25             if (vis[j] == 0 && dir[j] < min)  //每次找还未被最终更新的点中  到出发点最短的点
26             {
27                 pos=j;
28                 min=dir[j];
29             }
30         }
31         vis[pos]=1;
32         for (j=0; j<n; j++) //用目前最短的点去更新其它剩余的点
33         {
34             if (vis[j] == 0 && dir[j] > dir[pos] + map[pos][j])
35                 dir[j]=dir[pos]+map[pos][j];
36         }
37     }
38 }
39 
40 int main()
41 {
42     int i, j;
43     int a, b, d, s, t;
44     while(cin >> n >> m)
45     {
46         for (i=0; i<n; i++)      //初始化为最大值
47             for (j=0; j<n; j++)
48                 map[i][j]=MAX;
49         for (i=0; i<n; i++)
50             map[i][i]=0;
51         for (i=0; i<m; i++)
52         {
53             cin >> a >> b >> d;
54             if (d < map[a][b])    //防止 重边
55                 map[b][a]=map[a][b]=d;
56         }
57         cin >> s >> t;
58         dij(s);
59         if (dir[t] < MAX)
60             cout << dir[t] << endl;
61         else
62             cout << "-1" << endl;
63     }
64     return 0;
65 }
posted on 2012-08-07 16:13  zrq495  阅读(432)  评论(0编辑  收藏  举报