• 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
    ", city[end].number, city[end].call);
     75     //printf("%d
    ", 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
  • 相关阅读:
    作业练习
    作业练习
    作业
    作业
    作业
    作业
    作业
    作业
    作业
    作业
  • 原文地址:https://www.cnblogs.com/echobfy/p/3545917.html
Copyright © 2020-2023  润新知