Submission #1218035

#TimeUsernameProblemLanguageResultExecution timeMemory
1218035teslerphamCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
211 ms18416 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define eb emplace_back #define all(x) begin(x), end(x) #define sz(x) ((int)(x).size()) #define el '\n' using ll = long long; using pii = pair<int,int>; using vi = vector<int>; using vll = vector<ll>; const ll LINF = (ll)4e18; void fastIO(){ ios::sync_with_stdio(false); cin.tie(nullptr); } vector<vector<pii>> adj; int n, m; vll dU, dV, distS, distT, dpF, dpB, distF, distB; vll dijkstra(int src){ vll d(n, LINF); priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<>> pq; d[src] = 0; pq.emplace(0, src); while(!pq.empty()){ auto [du,u] = pq.top(); pq.pop(); if(du > d[u]) continue; for(auto [v,w]: adj[u]){ ll nd = du + w; if(nd < d[v]){ d[v] = nd; pq.emplace(nd, v); } } } return d; } void dp_run(int start, vll &dist, vll &dp){ // dist[...] and dp[...] initialized to LINF dist[start] = 0; dp[start] = dV[start]; priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<>> pq; pq.emplace(0, start); while(!pq.empty()){ auto [du,u] = pq.top(); pq.pop(); if(du > dist[u]) continue; ll pre = dp[u]; for(auto [v,w]: adj[u]){ ll nd = du + w; if(nd < dist[v]){ dist[v] = nd; dp[v] = min(pre, dV[v]); pq.emplace(nd, v); } else if(nd == dist[v]){ dp[v] = min(dp[v], min(pre, dV[v])); } } } } int main(){ fastIO(); cin >> n >> m; int S, T, U, V; cin >> S >> T >> U >> V; --S; --T; --U; --V; adj.assign(n, {}); for(int i = 0; i < m; i++){ int a,b; ll c; cin >> a >> b >> c; --a; --b; adj[a].eb(b,c); adj[b].eb(a,c); } dU = dijkstra(U); dV = dijkstra(V); distS = dijkstra(S); distT = dijkstra(T); ll bestST = distS[T]; // 3) Forward DP from S distF.assign(n, LINF); dpF .assign(n, LINF); dp_run(S, distF, dpF); // 4) Backward DP from T // reuse adj but run from T distB.assign(n, LINF); dpB .assign(n, LINF); dp_run(T, distB, dpB); ll ans = dU[V]; // no pass for(int i = 0; i < n; i++){ if(distF[i] + distB[i] == bestST){ ll via = min(dpF[i], dpB[i]) + dU[i]; ans = min(ans, via); } } cout << ans << el; return 0; } /* ⢀⡴⠑⡄⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣤⣀⡀ Monkey D. LUFFY ⠸⡇⠀⠿⡀⠀⣀⡴⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀ "I’m gonna be..." ⠀⠀⠀⠀⠑⢄⣾⣷⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣯⣍⠻⣷⡄ ...King of the Pirates! ⠀⠀⠀⠀⢀⡀⠁⠈⠙⠻⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠟⠋ ⠀ ⠀⠀⠀⢀⡾⣁⣀⠀⠴⠂⠙⣗⡀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⣴⣷⠘⠿⠛⠃⠀⠀⠀⠉⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⣴⣿⠙⣆⠀⠀⠀⠀⠀⠀⠀⠈⠙⠒⠊⠁⠀⠀⠀⠀⠀ ⢀⣼⣿⠀⣇⣀⠀⠀⣠⣤⣶⣾⣿⣶⣶⣶⣶⠆⠀⠀⠀⠀ */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...