Advertisement
Corezzi

UVA 11367

Jan 26th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct PqEdge{
  6.     int d,fuel,v;
  7.      bool operator<(const PqEdge &b) const{
  8.         return d > b.d;
  9.     }
  10. };
  11.  
  12. int main(){
  13.     // ios_base::sync_with_stdio(false);
  14.     // cin.tie(NULL);
  15.    
  16.     int n,m;
  17.     cin >> n >> m;
  18.    
  19.     struct Edge{
  20.         int v,c;
  21.     };
  22.     vector<vector<Edge>> g(n);
  23.     vector<int> p(n);
  24.    
  25.     for(int i = 0; i < n; ++i)
  26.         cin >> p[i];
  27.    
  28.     while(m-->0){
  29.         int x,y,c;
  30.         cin >> x >> y >> c;
  31.         g[x].push_back({y,c});
  32.         g[y].push_back({x,c});
  33.     }
  34.    
  35.     int q;
  36.     cin >> q;
  37.     while(q--){
  38.         int c,s,e;
  39.         cin >> c >> s >> e;
  40.        
  41.         vector<vector<int>> d(n, vector<int>(c+1, ~(1<<31)));
  42.         priority_queue<PqEdge, vector<PqEdge>> pq;
  43.         pq.push({0,0,s});
  44.         d[s][0] = 0;
  45.        
  46.         while(!pq.empty()){
  47.             auto edge = pq.top();pq.pop();
  48.             if(edge.d > d[edge.v][edge.fuel]) continue;
  49.            
  50.             for(auto E : g[edge.v]){
  51.                 if(edge.fuel >= E.c){
  52.                     if(d[edge.v][edge.fuel] < d[E.v][edge.fuel - E.c]){
  53.                         d[E.v][edge.fuel - E.c] = d[edge.v][edge.fuel];
  54.                         pq.push({d[E.v][edge.fuel - E.c], edge.fuel - E.c, E.v});
  55.                     }
  56.                 }
  57.             }
  58.            
  59.             if(edge.fuel + 1 <= c){
  60.                 if(d[edge.v][edge.fuel] + p[edge.v] < d[edge.v][edge.fuel+1]){
  61.                     d[edge.v][edge.fuel + 1] = d[edge.v][edge.fuel] + p[edge.v];
  62.                     pq.push({d[edge.v][edge.fuel + 1], edge.fuel + 1, edge.v});
  63.                 }
  64.             }
  65.         }
  66.        
  67.         int min = ~(1<<31);
  68.         for(int f = 0; f <= c; ++f){
  69.             min = std::min(d[e][f], min);
  70.         }
  71.        
  72.         if(min == ~(1<<31)) cout << "impossible" << endl;
  73.         else cout << min << endl;
  74.     }
  75.    
  76.     return 0;
  77.    
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement