Advertisement
mickypinata

CUBE-T185: Osu! Mapping

Mar 30th, 2020
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. typedef long long lli;
  6.  
  7. typedef struct vert{
  8.     lli w;
  9.     int v;
  10. }vert;
  11.  
  12. typedef struct vstate{
  13.     lli w; // Weight
  14.     int v; // Vertex
  15.     int st; // State
  16.     bool operator < (const vstate &rhs)const{
  17.         return w > rhs.w;
  18.     }
  19. }vstate;
  20.  
  21. vector<vector<vert>> adj;
  22. int nv, ne, m, s, e;
  23.  
  24. lli Dijkstra(int s, int e){
  25.     vector<vector<bool>> visited(nv + 1, vector<bool>(m, false));
  26.     vector<vector<lli>> dist(nv + 1, vector<lli>(m, 1e18));
  27.     priority_queue<vstate> q;
  28.     bool found = false;
  29.     dist[s][1 % m] = 0;
  30.     q.push({dist[s][1 % m], s, 1 % m});
  31.     while(!q.empty()){
  32.         int u = q.top().v;
  33.         int st = q.top().st;
  34.         q.pop();
  35.         if(visited[u][st]){
  36.             continue;
  37.         }
  38.         if(u == e && st == 0){
  39.             found = true;
  40.             break;
  41.         }
  42.         visited[u][st] = true;
  43.         for(auto nxt : adj[u]){
  44.             int v = nxt.v;
  45.             int w = nxt.w;
  46.             if(!visited[v][(st + 1) % m] && dist[u][st] + w < dist[v][(st + 1) % m]){
  47.                 dist[v][(st + 1) % m] = dist[u][st] + w;
  48.                 q.push({dist[v][(st + 1) % m], v, (st + 1) % m});
  49.             }
  50.         }
  51.     }
  52.     if(found){
  53.         return dist[e][0];
  54.     } else {
  55.         return -1;
  56.     }
  57. }
  58.  
  59. int main(){
  60.  
  61.     int u, v, w;
  62.  
  63.     scanf("%d %d %d", &nv, &ne, &m);
  64.     scanf("%d %d", &s, &e);
  65.     adj.assign(nv + 1, vector<vert>());
  66.     for(int i = 1; i <= ne; ++i){
  67.         scanf("%d %d %d", &u, &v, &w);
  68.         adj[u].push_back({w, v});
  69.     }
  70.     cout << Dijkstra(s, e);
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement