Submission #1169425

#TimeUsernameProblemLanguageResultExecution timeMemory
1169425AriadnaCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
235 ms28032 KiB
#include <bits/stdc++.h> #define pb push_back #define int long long using namespace std; const int MAX_N = 1e5; vector<pair<int, int>> adj[MAX_N]; vector<int> dijkstra(int n, int s) { vector<int> dist(n, 1e18); priority_queue<pair<int, int>> pq; pq.push({0, s}); dist[s] = 0; while (!pq.empty()) { int d = -pq.top().first; int u = pq.top().second; pq.pop(); if (dist[u] != d) continue; for (pair<int, int> v: adj[u]) { if (dist[v.first] > dist[u]+v.second) { dist[v.first] = dist[u]+v.second; pq.push({-dist[v.first], v.first}); } } } return dist; } vector<pair<int, vector<int>>> dijkstra2(int n, int s) { vector<pair<int, vector<int>>> dist(n, {1e18, {}}); dist[s] = {0, {s}}; priority_queue<pair<int, int>> pq; pq.push({0, s}); while (!pq.empty()) { int d = -pq.top().first; int u = pq.top().second; pq.pop(); if (dist[u].first != d) continue; for (pair<int, int> v: adj[u]) { if (dist[v.first].first == dist[u].first+v.second) { dist[v.first].second.push_back(u); } else if (dist[v.first].first > dist[u].first+v.second) { dist[v.first] = {dist[u].first+v.second, {u}}; pq.push({-dist[v.first].first, v.first}); } } } return dist; } int ans; vector<int> dist_u, dist_v; vector<pair<int, vector<int>>> dist; vector<bool> vis; vector<int> du, dv; void calc_camino(int u) { if (vis[u]) return; vis[u] = true; for (int v: dist[u].second) { calc_camino(v); int d1 = dist_u[u], d2 = dist_v[u]; d1 = min(du[v], d1); d2 = min(dv[v], d2); ans = min(ans, d1+d2); if (du[u]+dv[u] > d1+d2) { du[u] = d1; dv[u] = d2; } } } signed main() { ios::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; int s, t, u, v; cin >> s >> t >> u >> v; --s; --t; --u; --v; while (m--) { int a, b, c; cin >> a >> b >> c; --a; --b; adj[a].pb({b, c}); adj[b].pb({a, c}); } dist_u = dijkstra(n, u); dist_v = dijkstra(n, v); dist = dijkstra2(n, s); ans = dist_u[v]; vis = vector<bool>(n, false); vis[s] = true; du = dv = vector<int>(n); for (int i = 0; i < n; ++i) { du[i] = dist_u[i]; dv[i] = dist_v[i]; } calc_camino(t); cout << ans << endl; 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...