Submission #908505

#TimeUsernameProblemLanguageResultExecution timeMemory
908505thinknoexitCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
394 ms30104 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 100100; struct A { int v; ll w; int p; bool operator < (const A& o) const { return w > o.w; } }; int n; ll dis1[N], dis2[N], dis[N]; ll dp[2][N]; // from u -> p1 , from p2 -> v bool vis[N]; vector<A> adj[N]; priority_queue<A> pq; ll solve(int s, int t) { memset(dis, 0x3f, sizeof dis); memset(dp, 0x3f, sizeof dp); memset(vis, 0, sizeof vis); dis[s] = 0; pq.push({ s, 0, 0 }); while (!pq.empty()) { auto x = pq.top(); pq.pop(); int v = x.v, p = x.p; ll w = x.w; if (!vis[v]) { dis[v] = w; vis[v] = 1; dp[0][v] = min(dis1[v], dp[0][p]); dp[1][v] = min(dis2[v], dp[1][p]); for (auto& x : adj[v]) { if (dis[x.v] > dis[v] + x.w) { pq.push({ x.v, dis[v] + x.w, v }); } } } else if (w == dis[v]) { if (dp[0][v] + dp[1][v] > min(dis1[v], dp[0][p]) + min(dis2[v], dp[1][p])) { dp[0][v] = min(dis1[v], dp[0][p]); dp[1][v] = min(dis2[v], dp[1][p]); } } } return dp[0][t] + dp[1][t]; } int main() { cin.tie(nullptr)->sync_with_stdio(false); int m; cin >> n >> m; int s, t, u, v; cin >> s >> t >> u >> v; while (m--) { int u, v, w; cin >> u >> v >> w; adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); } memset(dis1, 0x3f, sizeof dis1); pq.push({ u, 0, 0 }); dis1[u] = 0; while (!pq.empty()) { auto x = pq.top(); pq.pop(); int v = x.v; for (auto& x : adj[v]) { if (dis1[x.v] > dis1[v] + x.w) { dis1[x.v] = dis1[v] + x.w; pq.push({ x.v, dis1[x.v], 0 }); } } } memset(dis2, 0x3f, sizeof dis2); pq.push({ v, 0, 0 }); dis2[v] = 0; while (!pq.empty()) { auto x = pq.top(); pq.pop(); int v = x.v; for (auto& x : adj[v]) { if (dis2[x.v] > dis2[v] + x.w) { dis2[x.v] = dis2[v] + x.w; pq.push({ x.v, dis2[x.v], 0 }); } } } cout << min({ dis2[u], solve(s, t), solve(t, s) }); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...