Submission #1265039

#TimeUsernameProblemLanguageResultExecution timeMemory
1265039canhnam357Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
236 ms16528 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int N, M, S, T, U, V; cin >> N >> M >> S >> T >> U >> V; vector<vector<pair<int, int>>> adj(N + 1); for (int i = 0; i < M; i++) { int u, v, w; cin >> u >> v >> w; adj[u].emplace_back(v, w); adj[v].emplace_back(u, w); } const long long inf = 1e18; vector<long long> ds(N + 1, inf), dt(N + 1, inf), du(N + 1, inf), dv(N + 1, inf); { ds[S] = 0; priority_queue<pair<long long, int>> q; q.emplace(0LL, S); while (!q.empty()) { auto [d, u] = q.top(); q.pop(); d = -d; if (d != ds[u]) continue; for (auto [v, w] : adj[u]) { long long nd = w + d; if (nd < ds[v]) { ds[v] = nd; q.emplace(-nd, v); } } } } { dt[T] = 0; priority_queue<pair<long long, int>> q; q.emplace(0LL, T); while (!q.empty()) { auto [d, u] = q.top(); q.pop(); d = -d; if (d != dt[u]) continue; for (auto [v, w] : adj[u]) { long long nd = w + d; if (nd < dt[v]) { dt[v] = nd; q.emplace(-nd, v); } } } } { du[U] = 0; priority_queue<pair<long long, int>> q; q.emplace(0LL, U); while (!q.empty()) { auto [d, u] = q.top(); q.pop(); d = -d; if (d != du[u]) continue; for (auto [v, w] : adj[u]) { long long nd = w + d; if (nd < du[v]) { du[v] = nd; q.emplace(-nd, v); } } } } { dv[V] = 0; priority_queue<pair<long long, int>> q; q.emplace(0LL, V); while (!q.empty()) { auto [d, u] = q.top(); q.pop(); d = -d; if (d != dv[u]) continue; for (auto [v, w] : adj[u]) { long long nd = w + d; if (nd < dv[v]) { dv[v] = nd; q.emplace(-nd, v); } } } } long long ans = du[V]; vector<long long> dp1(N + 1, inf), dp2(N + 1, inf), dp3(N + 1, inf), dp4(N + 1, inf), dp5(N + 1, inf); vector<int> ord(N); iota(ord.begin(), ord.end(), 1); sort(ord.begin(), ord.end(), [&](int i, int j) { return ds[i] < ds[j]; }); { dp1[S] = du[S]; for (int v : ord) { if (ds[v] + dt[v] != ds[T]) continue; for (auto [u, w] : adj[v]) { if (ds[u] + dt[u] != ds[T]) continue; if (ds[v] == w + ds[u] && dt[v] + w == dt[u]) { dp1[v] = min({dp1[u], du[v], dp1[v]}); } } } } { dp2[S] = dv[S]; for (int v : ord) { if (ds[v] + dt[v] != ds[T]) continue; for (auto [u, w] : adj[v]) { if (ds[u] + dt[u] != ds[T]) continue; if (ds[v] == w + ds[u] && dt[v] + w == dt[u]) { dp2[v] = min({dp2[u], dv[v], dp2[v]}); } } } } sort(ord.begin(), ord.end(), [&](int i, int j) { return dt[i] < dt[j]; }); { dp4[T] = du[T]; for (int v : ord) { if (ds[v] + dt[v] != ds[T]) continue; for (auto [u, w] : adj[v]) { if (ds[u] + dt[u] != ds[T]) continue; if (ds[v] == w + ds[u] && dt[v] + w == dt[u]) { dp4[v] = min({dp4[u], du[v], dp4[v]}); } } } } { dp5[T] = dv[T]; for (int v : ord) { if (ds[v] + dt[v] != ds[T]) continue; for (auto [u, w] : adj[v]) { if (ds[u] + dt[u] != ds[T]) continue; if (ds[v] == w + ds[u] && dt[v] + w == dt[u]) { dp5[v] = min({dp5[u], dv[v], dp5[v]}); } } } } sort(ord.begin(), ord.end(), [&](int i, int j) { return ds[i] < ds[j]; }); { dp3[S] = dp1[S] + dp2[S]; for (int v : ord) { if (ds[v] + dt[v] != ds[T]) continue; for (auto [u, w] : adj[v]) { if (ds[u] + dt[u] != ds[T]) continue; if (ds[v] == w + ds[u] && dt[v] + w == dt[u]) { dp3[v] = min({dp1[v] + dp5[v], dp2[v] + dp4[v], dp3[u], dp3[v]}); } } } } ans = min(ans, *min_element(dp3.begin(), dp3.end())); cout << ans; 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...