• 畅通工程续


    某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。 

    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

    Input本题目包含多组数据,请处理到文件结束。 
    每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。 
    接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。 
    再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。Output对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1. 
    Sample Input

    3 3
    0 1 1
    0 2 3
    1 2 1
    0 2
    3 1
    0 1 1
    1 2

    Sample Output

    2
    -1

    解题思路:最短路的问题;
     1 #include<iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 
     5 using namespace std;
     6 
     7 const int MAX = 10000 + 500;
     8 const long long  MAX1 = 1e10;
     9 
    10 int N,M;
    11 int qi,zhong;
    12 int visit[MAX];
    13 long long  dist[MAX];
    14 long long Map[MAX][MAX];
    15 
    16 void B()
    17 {
    18     for(int i =0;i <N;i++)
    19     {
    20         dist[i] = Map[qi][i];
    21         visit[i] = 0;
    22     }
    23     visit[qi] = 1;
    24 
    25     for(int i =0;i <N;i++)
    26     {
    27         long long min1 = MAX1;
    28         int min1num;
    29         for(int j =0 ; j<N;j++)
    30         {
    31             if(visit[j]==0&&dist[j] < min1)
    32             {
    33                 min1 = dist[j];
    34                 min1num = j;
    35             }
    36         }
    37 
    38         visit[min1num] = 1;
    39         for(int k = 0;k <N;k++)
    40         {
    41             if(visit[k]==0&&dist[k] > dist[min1num] + Map[min1num][k])
    42                 dist[k] = dist[min1num] + Map[min1num][k];
    43         }
    44     }
    45 
    46 }
    47 
    48 int main()
    49 {
    50     while(cin>>N>>M)
    51     {
    52         int x,y;
    53         long long len;
    54 
    55         for(int i =0; i<N;i++)
    56             for(int j = 0;j <N;j++)
    57                 if(i==j)
    58                     Map[i][j] = 0;
    59                 else
    60                     Map[i][j] = MAX1;
    61 
    62         for(int i =1;i <= M;i++)
    63         {
    64            cin>>x>>y>>len;
    65            if(len < Map[x][y])
    66             Map[x][y] = Map[y][x] = len;
    67         }
    68         cin>>qi>>zhong;
    69         B();
    70 
    71         if(dist[zhong] != MAX1)
    72             cout<<dist[zhong]<<endl;
    73         else
    74             cout<<"-1"<<endl;
    75 
    76 
    77     }
    78 
    79 
    80     return 0;
    81 }
  • 相关阅读:
    奶牛跑步2
    数据结构练习
    HighChats报表使用C#mvc导出本地图片
    选择论
    投票选举
    价值
    工作5年后总结的工作经验
    formValidator 不支持jquery1.9以上的解决办法
    随想29:没有最完美的制度,只有最适合的制度
    随想28:愿我成为一个高级黑
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7375348.html
Copyright © 2020-2023  润新知