Advertisement
mickypinata

CUBE-T196: Royal Parade

Jul 19th, 2021
862
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef pair<int, int> pii;
  6. typedef pair<lli, int> pli;
  7.  
  8. const int N = 1e5;
  9.  
  10. vector<pii> adj[N + 1];
  11. int nVertex;
  12. lli dist[2][N + 1];
  13. bool visited[N + 1], royal[N + 1];
  14.  
  15. void dijkstra(int i, int st){
  16.     for(int u = 1; u <= nVertex; ++u){
  17.         dist[i][u] = 1e18;
  18.         visited[u] = false;
  19.     }
  20.     priority_queue<pli, vector<pli>, greater<pli>> pq;
  21.     dist[i][st] = 0;
  22.     pq.emplace(dist[i][st], st);
  23.     while(!pq.empty()){
  24.         int u = pq.top().second;
  25.         pq.pop();
  26.         if(visited[u]){
  27.             continue;
  28.         }
  29.         visited[u] = true;
  30.         for(pii p : adj[u]){
  31.             int v = p.first;
  32.             int w = p.second;
  33.             if(!visited[v] && dist[i][u] + w < dist[i][v]){
  34.                 dist[i][v] = dist[i][u] + w;
  35.                 pq.emplace(dist[i][v], v);
  36.             }
  37.         }
  38.     }
  39. }
  40.  
  41. int main(){
  42.  
  43.     int nEdge;
  44.     scanf("%d%d", &nVertex, &nEdge);
  45.     for(int i = 1; i <= nEdge; ++i){
  46.         int u, v, w;
  47.         scanf("%d%d%d", &u, &v, &w);
  48.         adj[u].emplace_back(v, w);
  49.         adj[v].emplace_back(u, w);
  50.     }
  51.     int royalSt, royalEd, st, ed;
  52.     scanf("%d%d%d%d", &royalSt, &royalEd, &st, &ed);
  53.     dijkstra(0, royalSt);
  54.     dijkstra(1, royalEd);
  55.  
  56.     lli stPath = dist[0][royalEd];
  57.     for(int i = 1; i <= nVertex; ++i){
  58.         if(dist[0][i] + dist[1][i] == stPath){
  59.             royal[i] = true;
  60.         }
  61.     }
  62.  
  63.     for(int i = 1; i <= nVertex; ++i){
  64.         dist[0][i] = 1e18;
  65.         visited[i] = false;
  66.     }
  67.     priority_queue<pli, vector<pli>, greater<pli>> pq;
  68.     if(!royal[st]){
  69.         dist[0][st] = 0;
  70.         pq.emplace(dist[0][st], st);
  71.     }
  72.     while(!pq.empty()){
  73.         int u = pq.top().second;
  74.         pq.pop();
  75.         if(visited[u]){
  76.             continue;
  77.         }
  78.         if(u == ed){
  79.             cout << dist[0][ed];
  80.             return 0;
  81.         }
  82.         visited[u] = true;
  83.         for(pii p : adj[u]){
  84.             int v = p.first;
  85.             int w = p.second;
  86.             if(!royal[v] && !visited[v] && dist[0][u] + w < dist[0][v]){
  87.                 dist[0][v] = dist[0][u] + w;
  88.                 pq.emplace(dist[0][v], v);
  89.             }
  90.         }
  91.     }
  92.     cout << "-1";
  93.  
  94.     return 0;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement