hdu1874(畅通工程续)

hdu1874(畅通工程续)
 1  /*
 2  Author:    Leo.W
 3  Descriptipn:    给定图上的n个点及m条点间连线,试求从S点到W点的最短距离,若不存在,则输出-1;  
 4  How to Do:    经典的最短路算法的应用,dijkstra算法自编写
 5     */
 6 #include <iostream>
 7  using  namespace std;
 8  int n,m; // 点的个数,点间连线的条数
 9  int path[205][1005];
10  bool node[205];
11  int Dijkstras( int s, int w){
12      int i,j;
13     node[s]= true;
14      for(i=0;i<n;i++){
15          int mins=INT_MAX,pos=s;
16          for(j=0;j<n;j++){ // 寻找为选入点的最小值
17               if(!node[j]&&mins>path[s][j]){
18                 mins=path[s][j]; pos=j;
19             }
20         }
21          if(mins==INT_MAX||j>n)     break;
22         node[pos]= true;
23          for(j=0;j<n;j++){
24              if(!node[j]&&path[pos][j]!=INT_MAX&&path[s][j]>path[s][pos]+path[pos][j]){
25                 path[s][j]=path[s][pos]+path[pos][j];
26                 path[j][s]=path[s][j];
27             }
28         }
29     }
30      return path[s][w];
31 }
32  int main(){
33      // freopen("in.txt","r",stdin);
34       while(scanf("%d%d",&n,&m)!=EOF){
35          int i,j;
36          for(i=0;i<n;i++){
37             node[i]= false;
38              for(j=0;j<n;j++){
39                  if(j==i)    path[i][j]=0;
40                  else    path[i][j]=INT_MAX; // 表示两点间无通路
41              }
42         }
43          for(i=0;i<m;i++){
44              int begin,end,len;
45             scanf("%d%d%d",&begin,&end,&len);
46              if(len<path[begin][end]) //此处是全题关键,WA了很久。。。。【审题要细致啊】
47                 path[begin][end]=path[end][begin]=len; // 双向赋值
48          }
49          int s,w;
50         scanf("%d%d",&s,&w);
51          if(s>w){
52             s=s^w;w=s^w;s=s^w;
53         }
54          if(s==w)
55             printf("0\n");
56          else{
57              int ans=Dijkstras(s,w);
58              if(ans==INT_MAX)    printf("-1\n");
59              else    printf("%d\n",ans);
60         }
61     }
62      return 0;
63 }

你可能感兴趣的:(hdu1874(畅通工程续))