Advertisement
BaoJIaoPisu

Untitled

Jan 20th, 2022
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. auto sub4 = [&]() -> void {
  2.         vector<vector<ll>> dp(22, vector<ll>(n + 5, INF));
  3.         auto dijkstra = [&](int id, int source) -> void {
  4.             dp[id][source] = 0;
  5.             struct PQ {
  6.                 int u; ll w;
  7.                 bool operator < (const PQ & temp) const {
  8.                     return w > temp.w;
  9.                 };
  10.             };
  11.  
  12.             priority_queue<PQ> q;
  13.             q.push({source, 0});
  14.  
  15.             while(!q.empty()) {
  16.                 int u = q.top().u;
  17.                 ll f = q.top().w;
  18.                 q.pop();
  19.  
  20.                 if(dp[id][u] != f) continue;
  21.  
  22.                 for(auto v : g[u]) {
  23.                     if(minimize(dp[id][v.fi], dp[id][u] + v.se)) q.push({v.fi, dp[id][v.fi]});
  24.                 }
  25.             }
  26.         };
  27.  
  28.         for(int i = 0; i <= k; i++) {
  29.             dijkstra(i * 2, a[i]);
  30.             dijkstra(i * 2 + 1, b[i]);
  31.         }
  32.  
  33.         struct PQ {
  34.             int u; ll w;
  35.             bool operator < (const PQ & temp) const {
  36.                 return w < temp.w;
  37.             };
  38.         };
  39.         priority_queue<PQ> q;
  40.  
  41.         for(int i = 1; i <= n; i++) res[i] = -1;
  42.         q.push({a[0], 0});
  43.         res[a[0]] = 0;
  44.  
  45.         auto on_road = [&](int u, int v, int w) -> bool {
  46.             if(dp[0][u] + dp[1][u] != dp[0][b[0]]) return false;
  47.             if(dp[0][v] + dp[1][v] != dp[0][b[0]]) return false;
  48.             if(dp[0][u] + w != dp[0][v]) return false;
  49.  
  50.             for(int i = 1; i <= k; i++) {
  51.                 if(dp[2 * i][u] + dp[2 * i + 1][u] != dp[2 * i][b[i]]) continue;
  52.                 if(dp[2 * i][v] + dp[2 * i + 1][v] != dp[2 * i][b[i]]) continue;
  53.                 if(dp[2 * i][u] + w != dp[2 * i][v]) continue;
  54.                 if(dp[0][u] != dp[2 * i][u]) continue;
  55.                 if(dp[0][v] != dp[2 * i][v]) continue;
  56.                 return true;
  57.             }
  58.  
  59.             return false;
  60.         };
  61.  
  62.         auto in_way = [&](int u, int v, int w) -> bool {
  63.             if(dp[0][u] + w != dp[0][v]) return false;
  64.             if(dp[0][u] + dp[1][u] != dp[0][b[0]]) return false;
  65.             if(dp[0][v] + dp[1][v] != dp[0][b[0]]) return false;
  66.             return true;
  67.         };
  68.  
  69.  
  70.         while(!q.empty()) {
  71.             PQ T = q.top(); q.pop();
  72.             int u = T.u;
  73.             ll f = T.w;
  74.  
  75.             if(f != res[u]) continue;
  76.             for(auto v : g[u]) {
  77.                 if(dp[0][u] + v.se == dp[0][v.fi] && on_road(u, v.fi, v.se)) {
  78.                     if(maximize(res[v.fi], res[u] + v.se)) q.push({v.fi, res[v.fi]});
  79.                 } else if(in_way(u, v.fi, v.se)) {
  80.                     if(maximize(res[v.fi], res[u])) q.push({v.fi, res[v.fi]});
  81.                 }
  82.             }
  83.         }
  84.  
  85.         ll ans = 0;
  86.         for(int i = 1; i <= n; i++) maximize(ans, res[i]);
  87.         cout << ans;
  88.     };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement