zoukankan      html  css  js  c++  java
  • PAT 1087

    又是最短路,陈越姥姥好像很喜欢最短路... 这道题之后还得再写一遍,最短路一定要熟悉

    碰到一个坑,就是在加最短路的时候,不是++,而是要把前面的最短路加进来... 

      1 #include <vector>
      2 #include <string>
      3 #include <iostream>
      4 #include <map>
      5 #include <fstream>
      6 
      7 //#define OJ
      8 
      9 #ifdef OJ
     10 #define fin cin
     11 #endif
     12 
     13 using namespace std;
     14 
     15 class city{
     16 public:
     17     int happiness;
     18     string name;
     19     
     20     vector<int> adj;
     21     vector<int> cost;
     22 };
     23 
     24 vector<city> cities;
     25 map<string, int> city_idx;
     26 map<int, string> city_name;
     27 
     28 void dij(){
     29     int total = cities.size();
     30     int MAX = 0x7fffffff;
     31 
     32     vector<bool> visited(total, false);
     33     vector<int> dij_dist(total, MAX);
     34     vector<int> dij_happiness(total, 0);
     35     vector<int> prev(total, -1);
     36     vector<int> dij_cnt(total, MAX);
     37     vector<int> dij_least_cnt(total, 0);
     38 
     39     int target_idx = city_idx["ROM"];
     40 
     41     dij_dist[0] = 0;
     42     dij_cnt[0] = 0;
     43     dij_least_cnt[0] = 1;
     44 
     45     while (true){
     46         int least_dist = MAX;
     47         int least_idx = -1;
     48 
     49         for (int i = 0; i < total; i++){
     50             if (!visited[i] && least_dist > dij_dist[i]){
     51                 least_idx = i;
     52                 least_dist = dij_dist[i];
     53             }
     54         }
     55 
     56         if (least_idx == -1)
     57             break;
     58         if (least_idx == target_idx) // ?
     59             break;
     60 
     61         visited[least_idx] = true;
     62         vector<int> &adj = cities[least_idx].adj;
     63         vector<int> &cost = cities[least_idx].cost;
     64         for (int i = 0; i < adj.size(); i++){
     65             int cur_idx = adj[i];
     66             if (visited[cur_idx])
     67                 continue;
     68             if (least_dist + cost[i] < dij_dist[cur_idx]){
     69                 dij_dist[cur_idx] = least_dist + cost[i];
     70                 prev[cur_idx] = least_idx;
     71                 dij_cnt[cur_idx] = dij_cnt[least_idx] + 1;
     72                 dij_happiness[cur_idx] = dij_happiness[least_idx] + cities[cur_idx].happiness;
     73                 dij_least_cnt[cur_idx] = dij_least_cnt[least_idx];
     74             }
     75             else if (least_dist + cost[i] == dij_dist[cur_idx]){
     76                 dij_least_cnt[cur_idx] += dij_least_cnt[least_idx];
     77 
     78                 if (dij_happiness[least_idx] + cities[cur_idx].happiness > dij_happiness[cur_idx]){
     79                     prev[cur_idx] = least_idx;
     80                     dij_cnt[cur_idx] = dij_cnt[least_idx] + 1;
     81                     dij_happiness[cur_idx] = dij_happiness[least_idx] + cities[cur_idx].happiness;
     82                 }
     83                 else if (dij_happiness[least_idx] + cities[cur_idx].happiness == dij_happiness[cur_idx]){
     84                     if (dij_cnt[least_idx] + 1 < dij_cnt[cur_idx]){
     85                         prev[cur_idx] = least_idx;
     86                         dij_cnt[cur_idx] = dij_cnt[least_idx] + 1;
     87                     }
     88                 }
     89             }
     90         }
     91     }
     92 
     93     int idx = target_idx;
     94     cout << dij_least_cnt[target_idx] << " " << dij_dist[target_idx] << " " << dij_happiness[target_idx] << " " << (int)(dij_happiness[target_idx] / dij_cnt[target_idx]) << endl;
     95     
     96     vector<int> res;
     97     
     98     while (idx != 0){
     99         res.push_back(idx);
    100         idx = prev[idx];
    101     }
    102     cout << city_name[0];
    103     for (int i = res.size() - 1; i >= 0; i--)
    104         cout << "->" << city_name[res[i]];
    105     cout << endl;
    106 }
    107 
    108 int main(){
    109 #ifndef OJ
    110     ifstream fin;
    111     fin.open("in.data");
    112 #endif
    113 
    114 
    115     int N, K;
    116     fin >> N >> K;
    117 
    118     string name;
    119     fin >> name;
    120     city_idx[name] = 0;
    121     city_name[0] = name;
    122 
    123     city c;
    124     c.name = name;
    125     c.happiness = 0;
    126 
    127     cities.push_back(c);
    128 
    129     for (int i = 1; i < N; i++){
    130         fin >> c.name;
    131         fin >> c.happiness;
    132 
    133         cities.push_back(c);
    134 
    135         city_name[i] = c.name;
    136         city_idx[c.name] = i;
    137     }
    138 
    139     for (int i = 0; i < K; i++){
    140         int c1, c2, cost;
    141 
    142         fin >> name;
    143         c1 = city_idx[name];
    144 
    145         fin >> name;
    146         c2 = city_idx[name];
    147 
    148         fin >> cost;
    149 
    150         cities[c1].adj.push_back(c2);
    151         cities[c1].cost.push_back(cost);
    152         cities[c2].adj.push_back(c1);
    153         cities[c2].cost.push_back(cost);
    154     }
    155 
    156     dij();
    157 
    158     return 0;
    159 }
  • 相关阅读:
    滚~滚~滚动条(移动端 )
    JS数据模板分离(告别字符串拼接)-template
    五子棋大战(人机)
    数据结构——队列
    数据结构——栈
    mysql下的SELECT INTO语句
    海明校验码
    android 调出显示标题栏(title bar)
    Windows failed to start.界面下修复win8引导
    android 修改背景色(转)
  • 原文地址:https://www.cnblogs.com/EpisodeXI/p/4095872.html
Copyright © 2011-2022 走看看