Advertisement
Guest User

Kek

a guest
Oct 17th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #pragma GCC optimize("Ofast,no-stack-protector")
  2. #pragma GCC optimize("O3")
  3. #pragma GCC target("avx2")
  4. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
  5. #pragma GCC optimize("unroll-loops")
  6. #pragma GCC optimize("fast-math")
  7. #pragma GCC optimize("section-anchors")
  8. #pragma GCC optimize("profile-values,profile-reorder-functions,tracer")
  9. #pragma GCC optimize("vpt")
  10. #pragma GCC optimize("rename-registers")
  11. #pragma GCC optimize("move-loop-invariants")
  12. #pragma GCC optimize("unswitch-loops")
  13. #pragma GCC optimize("function-sections")
  14. #pragma GCC optimize("data-sections")
  15. #pragma GCC optimize("branch-target-load-optimize")
  16. #pragma GCC optimize("branch-target-load-optimize2")
  17. #pragma GCC optimize("btr-bb-exclusive")
  18. #pragma GCC optimize("O0")
  19. #include <iostream>
  20. #include <complex>
  21. #include <vector>
  22. #include <string>
  23. #include <algorithm>
  24. #include <cstdio>
  25. #include <numeric>
  26. #include <cstring>
  27. #include <ctime>
  28. #include <cstdlib>
  29. #include <set>
  30. #include <map>
  31. #include <unordered_map>
  32. #include <unordered_set>
  33. #include <list>
  34. #include <cmath>
  35. #include <bitset>
  36. #include <cassert>
  37. #include <queue>
  38. #include <stack>
  39. #include <deque>
  40. #include <random>
  41. using namespace std;
  42.  
  43. #define F first
  44. #define S second
  45. #define pb push_back
  46. #define pii pair <int, int>
  47. #define all(x) (x).begin(), (x).end()
  48. #define rall(x) (x).rbegin(), (x).rend()
  49. #define reunique(x) (x).resize(std::unique(all(x)) - (x).begin())
  50. #define roflan ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
  51. #define ld long double
  52. //#define int long long
  53.  
  54. int is[10500];
  55. int vis[10500];
  56. int dp[10500][600];
  57. vector <pii> g[10500];
  58. void Solve() {
  59.     for (int i = 0; i < 10500; i++) {
  60.         for (int j = 0; j < 600; j++) {
  61.             dp[i][j] = 1e9;
  62.         }
  63.     }
  64.     int k, n, m, U, V;
  65.     cin >> k >> n >> m >> U >> V;
  66.     U--, V--;
  67.     for (int i = 0; i < m; i++) {
  68.         int v, u, w;
  69.         cin >> v >> u >> w;
  70.         if (w > k) continue;
  71.         v--, u--;
  72.         g[v].pb({ u, w });
  73.         g[u].pb({ v, w });
  74.     }
  75.     int l;
  76.     cin >> l;
  77.     for (int i = 0; i < l; i++) {
  78.         int x;
  79.         cin >> x;
  80.         x--;
  81.         is[x] = 1;
  82.     }
  83.     queue <int> q;
  84.     q.push(U);
  85.     dp[U][k] = 0;
  86.     vis[U] = 1;
  87.     is[U] = is[V] = 0;
  88.     while (!q.empty()) {
  89.         auto now = q.front();
  90.         q.pop();
  91.         int v = now;
  92.         for (auto u : g[v]) {
  93.             int to = u.first, need = u.second;
  94.             //if (vis[to]) continue;
  95.             bool fl = 0;
  96.             for (int ost = 0; ost < k; ost++) {
  97.                 if (v == U || is[v])
  98.                     dp[v][k] = min(dp[v][k], dp[v][ost]);
  99.                 if (need > ost) continue;
  100.                 if (dp[v][ost] > 1e10) continue;
  101.                 if (dp[to][ost - need] > dp[v][ost]) {
  102.                     dp[to][ost - need] = dp[v][ost];
  103.                     fl = 1;
  104.                 }
  105.             }
  106.             if (v == U || is[v]) {
  107.                 if (dp[to][k - need] > dp[v][k] + is[v]) {
  108.                     dp[to][k - need] = dp[v][k] + is[v];
  109.                     fl = 1;
  110.                 }
  111.             }
  112.             if (fl) {
  113.                 q.push(to);
  114.                 vis[to] = 1;
  115.             }
  116.         }
  117.     }
  118.     int ans = 1e9;
  119.     for (int i = 0; i <= k; i++) {
  120.         ans = min(ans, dp[V][i]);
  121.     }
  122.     if (ans > 1e8)
  123.         cout << -1 << '\n';
  124.     else
  125.         cout << ans << '\n';
  126. }
  127. signed main() {
  128.     ios_base::sync_with_stdio(false);
  129.     cin.tie(0);
  130.     cout.tie(0);
  131.     //freopen("input.txt", "r", stdin);
  132.     //freopen("output.txt", "w", stdout);
  133.     Solve();
  134.  
  135.     return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement