Advertisement
mickypinata

IPST60: Collecting

Jun 25th, 2021
920
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef pair<int, int> pii;
  5. typedef pair<int, pii> pipii;
  6.  
  7. const int N = 5e4;
  8.  
  9. vector<pii> adj[N + 1];
  10. int seq[N + 1];
  11.  
  12. int main(){
  13.  
  14.     int nVertex, nEdge, tr, st, ed;
  15.     scanf("%d%d%d%d%d", &nVertex, &nEdge, &tr, &st, &ed);
  16.     for(int i = 1; i <= nVertex; ++i){
  17.         scanf("%d", &seq[i]);
  18.     }
  19.     for(int i = 1; i <= nEdge; ++i){
  20.         int u, v, w;
  21.         scanf("%d%d%d", &u, &v, &w);
  22.         adj[u].emplace_back(v, w);
  23.     }
  24.  
  25.     vector<vector<int>> dist(nVertex + 1, vector<int>(tr + 1, 1e9));
  26.     vector<vector<bool>> visited(nVertex + 1, vector<bool>(tr + 1, false));
  27.     priority_queue<pipii, vector<pipii>, greater<pipii>> pq;
  28.     dist[st][0] = 0;
  29.     pq.emplace(dist[st][0], pii(st, 0));
  30.     while(!pq.empty()){
  31.         pii curr = pq.top().second;
  32.         int u = curr.first;
  33.         int s = curr.second;
  34.         pq.pop();
  35.         if(u == ed && s == tr){
  36.             cout << dist[ed][tr];
  37.             return 0;
  38.         }
  39.         if(visited[u][s]){
  40.             continue;
  41.         }
  42.         visited[u][s] = true;
  43.         for(pii nxt : adj[u]){
  44.             int v = nxt.first;
  45.             int w = nxt.second;
  46.             int newS = (seq[v] == s + 1) ? s + 1 : s;
  47.             if(!visited[v][newS] && dist[u][s] + w < dist[v][newS]){
  48.                 dist[v][newS] = dist[u][s] + w;
  49.                 pq.emplace(dist[v][newS], pii(v, newS));
  50.             }
  51.         }
  52.     }
  53.     cout << "-1";
  54.  
  55.     return 0;
  56. }
  57.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement