Advertisement
YEZAELP

TUMSO18-C: Zombie Land

Jul 21st, 2021 (edited)
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using lli = long long;
  5. const lli INF = 1e18;
  6. const int N = 2e5 + 10;
  7. using pl = pair <lli, lli>;
  8. vector <pl> g[N];
  9. lli disS[N], disE[N], disAns[N];
  10. bool vsS[N], vsE[N], danger[N], vsAns[N];
  11. lli n, m, S, E, Q;
  12.  
  13. void FindS(){
  14.     for(lli i=0;i<=n;i++) disS[i] = INF, vsS[i] = false;
  15.     priority_queue <pl, vector <pl>, greater <pl>> pq;
  16.     disS[S] = 0;
  17.     pq.push({ disS[S] , S });
  18.     while(!pq.empty()){
  19.         lli d = pq.top().first, u = pq.top().second; pq.pop();
  20.         if(vsS[u]) continue; vsS[u] = true;
  21.         for(auto vw: g[u]){
  22.             lli v = vw.first, w = vw.second;
  23.             if(!vsS[v] and d + w < disS[v]){
  24.                 disS[v] = d + w;
  25.                 pq.push({disS[v], v});
  26.             }
  27.         }
  28.     }
  29. }
  30.  
  31. void FindE(){
  32.     for(lli i=0;i<=n;i++) disE[i] = INF, vsE[i] = false;
  33.     priority_queue <pl, vector <pl>, greater <pl>> pq;
  34.     disE[E] = 0;
  35.     pq.push({ disE[E] , E });
  36.     while(!pq.empty()){
  37.         lli d = pq.top().first, u = pq.top().second; pq.pop();
  38.         if(vsE[u]) continue; vsE[u] = true;
  39.         for(auto vw: g[u]){
  40.             lli v = vw.first, w = vw.second;
  41.             if(!vsE[v] and d + w < disE[v]){
  42.                 disE[v] = d + w;
  43.                 pq.push({disE[v], v});
  44.             }
  45.         }
  46.     }
  47. }
  48.  
  49. void FindAns(lli stp){
  50.     for(lli i=0;i<=n;i++) disAns[i] = INF, vsAns[i] = false;
  51.     priority_queue <pl, vector <pl>, greater <pl>> pq;
  52.     for(lli i=1;i<=n;i++){
  53.         if(disS[i] + disE[i] == stp){
  54.             danger[i] = true;
  55.             disAns[i] = 0;
  56.             pq.push({disAns[i], i});
  57.         }
  58.     }
  59.     while(!pq.empty()){
  60.         lli d = pq.top().first, u = pq.top().second; pq.pop();
  61.         if(vsAns[u]) continue; vsAns[u] = true;
  62.         for(auto vw: g[u]){
  63.             lli v = vw.first, w = vw.second;
  64.             if(!vsAns[v] and d + w < disAns[v]){
  65.                 disAns[v] = d + w;
  66.                 pq.push({disAns[v], v});
  67.             }
  68.         }
  69.     }
  70. }
  71.  
  72. int main(){
  73.  
  74.     scanf("%lld%lld%lld%lld", &n, &m, &S, &E);
  75.  
  76.     for(lli i=1;i<=m;i++){
  77.         lli u, v, w;
  78.         scanf("%lld%lld%lld", &u, &v, &w);
  79.         g[u].push_back({v, w});
  80.         g[v].push_back({u, w});
  81.     }
  82.  
  83.     FindS();
  84.     FindE();
  85.     lli stp = disS[E];
  86.  
  87.     FindAns(stp);
  88.  
  89.     scanf("%lld", &Q);
  90.  
  91.     for(lli q=1;q<=Q;q++){
  92.         lli u;
  93.         scanf("%lld", &u);
  94.         printf("%lld\n", disAns[u]);
  95.     }
  96.  
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement