Naxocist

Trip planner

May 2nd, 2022 (edited)
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using ll = long long;
  5. using pi = pair<int, int>;
  6. using tiii = tuple<int, int, int>;
  7.  
  8. const int N = 1005;
  9. vector<pi> adj[N];
  10. bool vis[N][105];
  11. int pr[N], dsu[N];
  12.  
  13.  
  14. int par(int u){
  15.     return (dsu[u] == u ? u : dsu[u] = par(dsu[u]));
  16. }
  17.  
  18.  
  19. void un(int u, int v){
  20.     int x = par(u), y = par(v);
  21.     if(x == y) return ;
  22.     dsu[x] = y;
  23. }
  24.  
  25.  
  26. int main() {
  27.     //freopen("input.in", "r", stdin);
  28.    
  29.     int n, m; scanf("%d%d", &n, &m);
  30.    
  31.     for(int i=0; i<n; ++i) scanf("%d", &pr[i]);
  32.  
  33.     while(m--){
  34.         int u, v, w; scanf("%d%d%d", &u, &v, &w);
  35.         adj[u].emplace_back(v, w);
  36.         adj[v].emplace_back(u, w);
  37.         un(u, v);
  38.     }
  39.  
  40.     int q; scanf("%d", &q);
  41.     while(q--){
  42.         int lim, s, e; scanf("%d%d%d", &lim, &s, &e);
  43.  
  44.         if(par(s) != par(e)){
  45.             printf("impossible\n");
  46.             continue;
  47.         }
  48.  
  49.         priority_queue<tiii, vector<tiii>, greater<tiii>> pq;
  50.         bool chk = 1;
  51.         pq.emplace(0, 0, s);
  52.  
  53.         while(pq.size()){
  54.             int cost, fuel, u;
  55.             tie(cost, fuel, u) = pq.top(); pq.pop();
  56.  
  57.             if(u == e){
  58.                 printf("%d\n", cost);
  59.                 chk = 0;
  60.                 break;
  61.             }
  62.            
  63.             if(vis[u][fuel]) continue;
  64.             vis[u][fuel] = 1;
  65.             if(fuel < lim) pq.emplace(cost + pr[u], fuel+1, u);
  66.  
  67.             for(pi x : adj[u]){
  68.                 if(fuel < x.second) continue;
  69.                 pq.emplace(cost, fuel-x.second, x.first);
  70.             }
  71.  
  72.         }
  73.  
  74.         if(chk) printf("impossible\n");
  75.         memset(vis, false, sizeof(vis));
  76.     }
  77.  
  78. }
  79.  
Add Comment
Please, Sign In to add comment