Advertisement
DiegoDF1445

Zak Galou

Apr 5th, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define all(a) a.begin(), a.end()
  4. #define forn(l, r) for(int i = l; i < (r); ++i)
  5. #define F first
  6. #define S second
  7. #define $ ios::sync_with_stdio(0);
  8.  
  9. using namespace std;
  10.  
  11. using ll = long long int;
  12. using ii = pair<int, int>;
  13. using vi = vector<int>;
  14.  
  15. const int INF = 0x3f3f3f3f;
  16. const int MAXN = -1;
  17.  
  18. //MAGIA
  19. int m;
  20. int magic_cost[1123], magic_dmg[1123];
  21.  
  22. //DP
  23. int dp[1123][1123];
  24. int seen[1123][1123], TC = 0;
  25.  
  26. //GRAFO
  27. vector<vi> graph;
  28. vi w;
  29.  
  30. int sol (int magic, int life) {
  31.     if (life <= 0) return 0;
  32.     if (magic == m) return INF;
  33.     if (seen[magic][life] == TC) return dp[magic][life];
  34.  
  35.     int next_magic = sol(magic + 1, life);
  36.     int get_magic  = sol(magic, life - magic_dmg[magic]) + magic_cost[magic];
  37.  
  38.     seen[magic][life] = TC;
  39.  
  40.     return dp[magic][life] = min(next_magic, get_magic);
  41. }
  42.  
  43. int dijkstra (int origin, int destiny) {
  44.  
  45.     vi dist(1001, INF);
  46.     priority_queue<ii> pq;
  47.  
  48.     dist[origin] = w[origin];
  49.     pq.push({dist[origin], origin});
  50.  
  51.     ii cur;
  52.     int node, mp;
  53.     int ts;
  54.  
  55.     while (!pq.empty()) {
  56.         cur = pq.top();
  57.         node = cur.S;
  58.         mp = -cur.F;
  59.  
  60.         pq.pop();
  61.  
  62.         if (mp > dist[node]) continue;
  63.  
  64.         for (auto edge : graph[node]) {
  65.             ts = w[edge] + dist[node];
  66.             if (ts < dist[edge]) {
  67.                 dist[edge] = ts;
  68.                 pq.push({-ts, edge});
  69.             }
  70.         }
  71.     }
  72.  
  73.     return dist[destiny];
  74. }
  75.  
  76.  
  77. int32_t main() {
  78.  
  79.     int n, g, k;
  80.     int a, b;
  81.     int ans;
  82.  
  83.     while (scanf("%d %d %d %d", &m, &n, &g, &k) && m) {
  84.         ++TC;
  85.  
  86.         forn (0, m) {
  87.             scanf("%d %d", &magic_cost[i], &magic_dmg[i]);
  88.         }
  89.  
  90.         graph.assign(n + 1, vi());
  91.         forn (0, g) {
  92.             scanf("%d %d", &a, &b);
  93.             graph[a].push_back(b);
  94.             graph[b].push_back(a);
  95.         }
  96.        
  97.         w.assign(n + 1, 0);
  98.         forn (0, k) {
  99.             scanf("%d %d", &a, &b);
  100.             w[a] += sol(0, b);
  101.         }
  102.  
  103.         ans = dijkstra(1, n);
  104.  
  105.         printf("%d\n", ans < INF ? ans : -1);
  106.  
  107.     }
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement