1003. Emergency (25)

分析:

  考察最短路,可以使用Dijkstra算法,关键在于有相等路径时的判断。

  特别注意:题目要求的是the number of different shortest paths 和 the maximum amount of rescue teams you can possibly gather。

  1 #include <stdio.h>

  2 #include <iostream>

  3 #include <string>

  4 #include <cctype>

  5 //#include <map>

  6 

  7 using namespace std;

  8 

  9 const int Max_required = 505;

 10 const int Max_int = 0x7fffffff;

 11 

 12 int map[Max_required][Max_required];

 13 int number_of_team_in_city[Max_required];

 14 

 15 struct CITY

 16 {

 17     int dist;

 18     bool visit;

 19     int call;

 20     int number;

 21 }city[Max_required];

 22 

 23 void Dijkstra(int start, int end, int n)

 24 {

 25     for (int i = 0; i < n; i++)

 26     {

 27         city[i].dist = Max_int;

 28         city[i].visit = 0;

 29         city[i].number = 0;

 30         city[i].call = 0;

 31     }

 32     city[start].dist = 0;

 33     city[start].call = number_of_team_in_city[start];

 34     city[start].number = 1;

 35 

 36     //work......

 37     for (int i = 0; i < n; i++)

 38     {

 39         int Min = Max_int, pos = -1;

 40         for (int j = 0; j < n; j++)

 41         {

 42             if (city[j].visit == 0 && city[j].dist < Min)

 43             {

 44                 Min = city[j].dist;

 45                 pos = j;

 46             }

 47         }

 48         if (pos == -1) break;

 49         city[pos].visit = 1;

 50 

 51         for (int j = 0; j < n; j++)

 52         {

 53             if (city[j].visit == 0 && map[pos][j] != Max_int) 

 54             {

 55                 if (city[j].dist > city[pos].dist + map[pos][j])

 56                 {

 57                     city[j].dist = city[pos].dist + map[pos][j];

 58                     //-------------------------------

 59                     city[j].number = city[pos].number;    //注意!

 60                     //---------------------------------

 61                     city[j].call = city[pos].call + number_of_team_in_city[j];

 62                 }

 63                 else if (city[j].dist == city[pos].dist + map[pos][j])

 64                 {

 65                     city[j].number += city[pos].number;

 66                     if (city[j].call < city[pos].call + number_of_team_in_city[j])

 67                         city[j].call = city[pos].call + number_of_team_in_city[j];

 68                     //city[j].call += city[pos].call;

 69                 }

 70             }

 71         }

 72     }

 73 

 74     printf("%d %d\n", city[end].number, city[end].call);

 75     //printf("%d\n", city[end].dist);

 76 }

 77 

 78 int main()

 79 {

 80     int n, m, start, end;

 81 

 82     while (scanf("%d%d%d%d", &n, &m, &start, &end) != EOF)

 83     {

 84         for (int i = 0; i < n; i++)

 85         {

 86             scanf("%d", &number_of_team_in_city[i]);

 87             for (int j = 0; j < n; j++)

 88                 map[i][j] = Max_int;

 89         }

 90 

 91         while (m--)

 92         {

 93             int from, to, road_len;

 94             scanf("%d%d%d", &from, &to, &road_len);

 95 

 96             map[from][to] = road_len;

 97             map[to][from] = road_len;

 98         }

 99 

100         Dijkstra(start, end, n);

101     }

102     return 0;

103 }
View Code

 

你可能感兴趣的:(merge)