ceva_megamind

Глеб и электрокар 2

Jan 15th, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11.  
  12.     ios_base::sync_with_stdio(false);
  13.     cin.tie(0);
  14.     cout.tie(0);
  15.     //просто считываем всё
  16.     int k, n, m, u, v, p, q, r;
  17.     cin >> k >> n >> m >> u >> v;
  18.     vector < vector < pair<int, int> > > g(n + 1);
  19.     for (int i = 0; i < m; ++i) {
  20.         cin >> p >> q >> r;
  21.         g[p].push_back({ q,r });
  22.         g[q].push_back({ p,r });
  23.     }
  24.     int l, x;
  25.     vector <bool> petrol(n + 1, false);
  26.     cin >> l;
  27.     for (int i = 0; i < l; i++) {
  28.         cin >> x;
  29.         petrol[x] = true;
  30.     }
  31.  
  32.     //dp[i][j]-мин. кол-во заправок, чтоб доехать до города i с бензином j
  33.     const long long INF = 1e18;
  34.     vector <vector<long long>> dp(n + 1, vector<long long>(k + 1, INF));
  35.     dp[u][k] = 0;
  36.     queue <pair<int,int>> qu;
  37.     qu.push({ u,k }); //очередь из пар город-текущий баланс бензина
  38.     while (!qu.empty()) {
  39.         pair<int,int> p = qu.front();
  40.         u = p.first;
  41.         int j = p.second;
  42.         qu.pop();
  43.         for (auto i = g[u].begin(); i != g[u].end(); i++) { //перебираем соседей
  44.             int len = (*i).second;
  45.             int versh = (*i).first;
  46.             if (j - len >= 0) { //хватает бензина, чтоб доехать
  47.                 if (dp[u][j]<dp[versh][j-len]) { //если можем обновить dp, кидаем опять в очередь
  48.                     dp[versh][j - len] = dp[u][j];
  49.                     qu.push({ versh,j - len });
  50.                 }
  51.             }
  52.             if (petrol[u]) { //u-заправка
  53.                 if (k - len >= 0) { // хватает бензина
  54.                     if (dp[u][j] + 1 < dp[versh][k - len]) { //можем обновить dp
  55.                         dp[versh][k - len] = dp[u][j] + 1;
  56.                         qu.push({ versh,k - len });
  57.                     }
  58.                 }
  59.             }
  60.         }
  61.     }
  62.     //ответ - минимальное кол-во заправок в dp[v] с любым бензином
  63.     auto ans = min_element(dp[v].begin(), dp[v].end());
  64.     if (*ans == INF)
  65.         cout << -1;
  66.     else
  67.         cout << *ans;
  68. }
Add Comment
Please, Sign In to add comment