Advertisement
matheus_monteiro

K-ésimo Caminho

Aug 28th, 2021
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ii pair<int, int>
  4. const int OO = 2000000001;
  5. const int MAX = 10000 * 110;
  6.  
  7. int n, m, q, U, V;
  8. set<ii> path_edge;
  9. vector<array<int, 3>> edges;
  10. vector<ii> G[MAX];
  11. int dist[MAX];
  12.  
  13. void mount(int k) {
  14.    for(auto &[u, v, w] : edges) {
  15.       for(int j = 0; j <= k; j++) {
  16.          int a = u * (k + 1) + j, b = v * (k + 1) + j + 1;
  17.          if(path_edge.count({u, v})) b--;
  18.          if(b > v * (k + 1) + k) b = v * (k + 1) + k;
  19.          G[a].push_back({b, w});
  20.       }
  21.    }
  22. }
  23.  
  24. void dijkstra(int k) {
  25.    for(int i = 0; i <= n * (k + 1) + k; i++)
  26.       dist[i] = OO;
  27.    dist[U * (k + 1)] = 0;
  28.    priority_queue<ii> pq;
  29.    pq.push({0, U * (k + 1)});
  30.    while(!pq.empty()) {
  31.       int u = pq.top().second;
  32.       int d = -pq.top().first;
  33.       pq.pop();
  34.       if(d > dist[u]) continue;
  35.       for(auto &[v, w] : G[u])
  36.          if(dist[v] > dist[u] + w) {
  37.             dist[v] = dist[u] + w;
  38.             pq.push({-dist[v], v});
  39.          }
  40.    }
  41. }
  42.  
  43. int32_t main() {
  44.    ios_base::sync_with_stdio(false);
  45.     cin.tie(nullptr);
  46.  
  47.    cin >> n >> m >> q >> U >> V; U--; V--;
  48.    
  49.    int cur, last = -1;
  50.    while(cin >> cur) {
  51.       cur--;
  52.       if(last != -1) {
  53.          // edge: last->cur
  54.          path_edge.insert({last, cur});
  55.       }
  56.       if(cur == V) break;
  57.       last = cur;
  58.    }
  59.  
  60.    int sp_cost = 0;
  61.    
  62.    for(int i = 0; i < m; i++) {
  63.       int u, v, w;
  64.       cin >> u >> v >> w; u--; v--;
  65.       edges.push_back({u, v, w});
  66.       if(path_edge.count({u, v})) sp_cost += w;
  67.    }
  68.    
  69.    mount(101);
  70.    dijkstra(101);
  71.  
  72.    while(q--) {
  73.       int k, d;
  74.       cin >> k >> d;
  75.       bool fl = false;
  76.       for(int j = k; j <= 102 and !fl; j++)
  77.          if( abs(dist[ V * 102 + j ] - sp_cost) <= d)
  78.             fl = true;
  79.       if(fl) cout << "SIM\n";
  80.       else cout << "NAO\n";
  81.    }
  82.    
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement