mrlolthe1st

Untitled

Aug 9th, 2021
1,637
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <string>
  6. #include <fstream>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <set>
  10. #include <map>
  11. #include <queue>
  12.  
  13. //#define int long long
  14.  
  15. #define vi vector<int>
  16. #define vec vector
  17.  
  18. using namespace std;
  19.  
  20. double get() {
  21.     return ((double)rand()) / RAND_MAX;
  22. }
  23. const int MOD = 1000000007;
  24.  
  25. int fact[1000010], inv[1000010];
  26.  
  27. int C(int k, int n) {
  28.     return fact[n] * inv[k] % MOD * inv[n - k] % MOD;
  29. }
  30.  
  31. int binpow(int a, int b) {
  32.     if (!b) return 1;
  33.     int x = binpow(a, b >> 1);
  34.     if (b & 1) return (((x * x) % MOD) * a) % MOD;
  35.     return((x * x) % MOD);
  36. }
  37.  
  38. signed main() {
  39.     ios::sync_with_stdio(false);
  40.     cin.tie(0);
  41.     cout.tie(0);
  42.     int n, m, s, k;
  43.     cin >> n >> m >> s >> k;
  44.     s--;
  45.     vi x(k);
  46.     for (auto& e : x) cin >> e, --e;
  47.     vi dm(n);
  48.     for (auto& e : dm) cin >> e;
  49.     vec<vec<pair<int, int>>> g(n);
  50.     vec<vi> dp(n, vi(1051, 2e9));
  51.     while (m--) {
  52.         int f, t, s;
  53.         cin >> f >> t >> s;
  54.         --f; --t;
  55.         g[f].push_back({ t, s });
  56.         g[t].push_back({ f, s });
  57.     }
  58.     queue<pair<pair<int, int>, int>> q;
  59.     q.push({ { s, dm[s] }, 0 });
  60.     while (q.size()) {
  61.         auto cur = q.front();
  62.         q.pop();
  63.         for (auto& e : g[cur.first.first]) {
  64.             if (e.second <= cur.first.second) {
  65.                 int nd = max(cur.first.second - e.second, dm[e.first]);
  66.                 if (dp[e.first][nd] > cur.second + e.second) {
  67.                     dp[e.first][nd] = cur.second + e.second;
  68.                     q.push({ {e.first, nd}, cur.second + e.second });
  69.                 }
  70.             }
  71.         }
  72.     }
  73.     int ans = 2e9;
  74.     for (auto& e : x) {
  75.         for (int i = 0; i < 1051; ++i)
  76.             ans = min(ans, dp[e][i]);
  77.     }
  78.     if (ans != 1e9)
  79.         cout << ans;
  80.     else cout << 0;
  81.  
  82. }
  83.  
  84. // N
  85. // Q L R X
  86. // N
  87. //
Advertisement
Add Comment
Please, Sign In to add comment