HDOJ1874 ( 畅通工程续 ) 【单源最短路径】

Problem : 1874 ( 畅通工程续 )     Judge Status : Accepted
RunId : 5991510    Language : C++    Author : qq1203456195
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
 1 /*Dijstra*/
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdlib>
 5 using namespace std;
 6 #define MAX 0x3f3f3f3f
 7 #define max 202
 8 int map[max][max],visited[max];
 9 
10 int main()
11 {
12     int n,m,i,j,a,b,d;
13     while(cin>>n>>m)
14     {
15         memset(map,MAX,sizeof(map));
16         for(i=0;i<n;i++)
17         {
18             visited[i]=0;//访问标志位
19             map[i][i]=0;//注意
20         }
21         while(m--)
22         {
23             cin>>a>>b>>d;
24             if(map[a][b]>d) map[a][b]=map[b][a]=d; /*注意可能会有多条路*/
25         }
26         cin>>a>>b;//s 和 t
27         int min,u;
28         visited[a]=1;
29         for(i=0;i<n;i++)
30         {
31             min=MAX;
32             for(j=0;j<n;j++)
33             {
34                 if(!visited[j]&&min>map[a][j])//j没有被访问,且和a之间的距离最短,记录为u
35                 {
36                     min=map[a][j];//min为a到j的距离
37                     u=j;
38                 }
39             }
40             visited[u]=1;//u被访问了
41             for(j=0;j<n;j++)//更新a的邻接点
42             {
43                 if(!visited[j]&&min+map[u][j]<map[a][j])//j没有被访问,并且min+map[u][j]<map[a][j]
44                     map[a][j]=min+map[u][j];
45             }
46         }
47         if(map[a][b]<MAX)    cout<<map[a][b]<<endl;
48         else  cout<<"-1"<<endl;
49     }
50     return 0;
51 }

 

posted @ 2012-05-24 22:37  ZH奶酪  阅读(508)  评论(0编辑  收藏  举报