Submission #702209

#TimeUsernameProblemLanguageResultExecution timeMemory
702209bebraCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
299 ms28448 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define dbg(x) cerr << #x << ": " << x << endl; const ll INF = 1e18; const int MAX_N = 1e5 + 5; vector<pair<int, int>> g[MAX_N]; vector<int> new_g[MAX_N]; ll dp[2][MAX_N]; ll dist[4][MAX_N]; void dfs_order(int v, vector<int>& order, vector<bool>& used) { used[v] = true; for (auto u : new_g[v]) { if (!used[u]) { dfs_order(u, order, used); } } order.push_back(v); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; int s1, t1; cin >> s1 >> t1; --s1, --t1; int s2, t2; cin >> s2 >> t2; --s2, --t2; vector<tuple<int, int, int>> edges(m); for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; --u, --v; int w; cin >> w; g[u].emplace_back(v, w); g[v].emplace_back(u, w); edges[i] = {u, v, w}; } { array<int, 4> start_vertices = {s2, t2, s1, t1}; for (int i = 0; i < 4; ++i) { int s = start_vertices[i]; fill_n(dist[i], n, INF); vector<bool> used(n); priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; pq.emplace(0, s); while (!pq.empty()) { auto [curr_dist, v] = pq.top(); pq.pop(); if (used[v]) continue; used[v] = true; dist[i][v] = curr_dist; for (const auto& [u, w] : g[v]) { if (used[u] || curr_dist + w >= dist[i][u]) continue; dist[i][u] = curr_dist + w; pq.emplace(dist[i][u], u); } } } } { for (auto [u, v, w] : edges) { for (int t = 0; t <= 1; ++t) { if (dist[2][u] + w == dist[2][v] && dist[2][v] + dist[3][v] == dist[2][t1]) { new_g[u].push_back(v); } swap(u, v); } } } vector<int> order; { vector<bool> used(n); dfs_order(s1, order, used); reverse(order.begin(), order.end()); } fill_n(dp[0], n, INF); fill_n(dp[1], n, INF); ll ans = dist[0][t2]; for (auto v : order) { for (int t = 0; t <= 1; ++t) { dp[t][v] = min(dp[t][v], dist[t][v]); for (auto u : new_g[v]) { dp[t][u] = min(dp[t][u], dp[t][v]); } ans = min(ans, dp[t][v] + dist[t ^ 1][v]); } } cout << ans << '\n'; 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...