Advertisement
Guest User

Super Mario

a guest
May 27th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define INF 2139062143
  4. #define MAX 100
  5. #define debug(x) cout << #x << " = " << x << endl
  6. #define fori(i, ini, lim) for(int i= int(ini); i<(int)lim; ++i)
  7. #define ford(i, ini, lim) for(int i= int(ini); i>=(int)lim; --i)
  8. using namespace std;
  9. typedef long long ll;
  10. typedef long double ld;
  11. typedef pair<int, int> ii;
  12. typedef pair<int, pair<int, ii> > pii;
  13. int a, b, K, m, l;
  14.  
  15. int dist[MAX+5][15][505];
  16. vector<ii> adj[MAX+5];
  17.  
  18. void dij(int s){
  19.     priority_queue<pii, vector<pii>, greater<pii> > pq;
  20.     dist[s][0][0] = 0; // vertex, k, quilometros left
  21.     pq.push(pii(0,make_pair(s, ii(0,0)))); // weight, vertex, k = how many times the boots were used, quilometros left
  22.     while(!pq.empty()){
  23.         pii cur = pq.top(); pq.pop();
  24.         int u = cur.second.first;
  25.         int w = cur.first;
  26.         int k = cur.second.second.first;
  27.         int isk = cur.second.second.second;
  28.  
  29.         if(w > dist[u][k][isk]) continue;
  30.         fori(i,0,adj[u].size()){
  31.             ii cadj = adj[u][i];
  32.             int v = cadj.first;
  33.             int nw = cadj.second;
  34.             // do not use the magic boots
  35.             if(dist[u][k][isk] + nw < dist[v][k][isk]){
  36.                 dist[v][k][isk] = dist[u][k][isk] + nw;
  37.                 pq.push(pii(dist[v][k][isk],make_pair(v, ii(k,0))));
  38.             }
  39.             // is in the middle of the run, so keep runing
  40.             if(isk >= nw && u <= a){
  41.                 if(dist[u][k][isk] < dist[v][k][isk-nw]){
  42.                     dist[v][k][isk-nw] = dist[u][k][isk];
  43.                     pq.push(pii(dist[v][k][isk-nw],make_pair(v, ii(k,isk-nw))));
  44.                 }
  45.             }  
  46.             // start a new run with the magic boots
  47.             if(k < K && l >= nw){
  48.                 if(dist[u][k][0] < dist[v][k+1][l-nw]){
  49.                     dist[v][k+1][l-nw] = dist[u][k][0];
  50.                     pq.push(pii(dist[v][k+1][l-nw],make_pair(v, ii(k+1,l-nw))));
  51.                 }
  52.             }
  53. cout << "u: " << u << " v: " << v << " nw: " << nw << " dist[u]: " << dist[u][k][isk] << " dist[v]: " << dist[v][k][isk] << " k: " << k << " isk: " << isk << endl;
  54.         }
  55.     }
  56. }
  57.  
  58. int main(){
  59.     ios_base::sync_with_stdio(false);
  60.  
  61.     int t; cin >> t;
  62.     while(t--){
  63.         cin >> a >> b >> m >> l >> K;
  64.         fori(i,0,a+b+1){
  65.             adj[i].clear();
  66.         }
  67.         fori(i,0,m){
  68.             int x, y, w; cin >> x >> y >> w;
  69.             adj[x].emplace_back(y,w);
  70.             adj[y].emplace_back(x,w);
  71.         }
  72.         memset(dist, 0x7F, sizeof(dist));
  73.         dij(a+b);
  74.         int ans = INF;
  75.         fori(j, 0, l){
  76.             fori(i, 0, K+1){
  77.                 ans = min(ans, dist[1][i][j]);
  78.             }
  79.         }
  80.         cout << ans << endl;
  81.     }
  82.  
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement