Advertisement
mickypinata

SP-T001: Tunnel System

Jun 29th, 2021 (edited)
1,375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 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. bool visited[N + 1];
  12. lli dist[N + 1], wifiDist[N + 1];
  13.  
  14. int main(){
  15.  
  16.     int nVertex, nEdge, nWifi, st, ed;
  17.     lli radius;
  18.     scanf("%d%d%d%lld%d%d", &nVertex, &nEdge, &nWifi, &radius, &st, &ed);
  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.         adj[v].emplace_back(u, w);
  24.     }
  25.  
  26.     for(int i = 1; i <= nVertex; ++i){
  27.         dist[i] = 1e18;
  28.         wifiDist[i] = -1;
  29.     }
  30.     priority_queue<pli, vector<pli>, greater<pli>> pq;
  31.     for(int i = 1; i <= nWifi; ++i){
  32.         int u;
  33.         scanf("%d", &u);
  34.         dist[u] = 0;
  35.         pq.emplace(0, u);
  36.     }
  37.     while(!pq.empty()){
  38.         int u = pq.top().second;
  39.         pq.pop();
  40.         if(wifiDist[u] != -1){
  41.             continue;
  42.         }
  43.         wifiDist[u] = radius - dist[u];
  44.         for(pii nxt : adj[u]){
  45.             int v = nxt.first;
  46.             int w = nxt.second;
  47.             if(wifiDist[v] == -1 && dist[u] + w < dist[v] && dist[u] + w <= radius){
  48.                 dist[v] = dist[u] + w;
  49.                 pq.emplace(dist[v], v);
  50.             }
  51.         }
  52.     }
  53.  
  54.     // Dijkstra Setup
  55.     for(int i = 1; i <= nVertex; ++i){
  56.         dist[i] = 1e18;
  57.         visited[i] = false;
  58.     }
  59.     if(wifiDist[st] == -1){
  60.         cout << "Impossible";
  61.         return 0;
  62.     }
  63.     // Dijkstra Algorithm
  64.     dist[st] = 0;
  65.     pq.emplace(dist[st], st);
  66.     while(!pq.empty()){
  67.         int u = pq.top().second;
  68.         pq.pop();
  69.         if(visited[u]){
  70.             continue;
  71.         }
  72.         if(u == ed){
  73.             cout << dist[ed];
  74.             return 0;
  75.         }
  76.         visited[u] = true;
  77.         for(pii nxt : adj[u]){
  78.             int v = nxt.first;
  79.             int w = nxt.second;
  80.             if(!visited[v] && dist[u] + w < dist[v] && wifiDist[v] >= 0 && wifiDist[u] + wifiDist[v] >= w){
  81.                 dist[v] = dist[u] + w;
  82.                 pq.emplace(dist[v], v);
  83.             }
  84.         }
  85.     }
  86.     cout << "Impossible";
  87.  
  88.     return 0;
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement