Submission #1270736

#TimeUsernameProblemLanguageResultExecution timeMemory
1270736flaming_top1Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
322 ms36088 KiB
#include <bits/stdc++.h> #define SPED \ ios_base::sync_with_stdio(false); \ cin.tie(0); \ cout.tie(0); #define endl "\n" #define fi first #define se second #define lint long long #define fami signed #define lore main #define freefire freopen #define Data tuple<int, int, lint> const lint INF = 1e15; using namespace std; int n, m, s, t, ss, tt, in1[100005], in2[100005]; lint sdist[100005], tdist[100005], ssdist[100005], ttdist[100005], dp1[100005], dp2[100005]; vector<pair<int, lint>> adj[100005], adj1[100005], adj2[100005]; vector<Data> edges; void dijkstra(int z, lint dist[]) { fill(dist + 1, dist + 1 + n, INF); dist[z] = 0; priority_queue<pair<lint, int>, vector<pair<lint, int>>, greater<pair<lint, int>>> pq; pq.emplace(0, z); while (!pq.empty()) { auto [du, u] = pq.top(); pq.pop(); if (du > dist[u]) continue; for (auto [v, w] : adj[u]) { if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; pq.emplace(dist[v], v); } } } } void topo1() { queue<int> temp; for (int i = 1; i <= n; i++) { if (in1[i] == 0) temp.emplace(i); dp1[i] = ssdist[i]; } while (!temp.empty()) { auto now = temp.front(); temp.pop(); for (auto [v, w] : adj1[now]) { dp1[v] = min(dp1[v], dp1[now]); --in1[v]; if (in1[v] == 0) temp.emplace(v); } } } void topo2() { queue<int> temp; for (int i = 1; i <= n; i++) { if (in2[i] == 0) temp.emplace(i); dp2[i] = ssdist[i]; } while (!temp.empty()) { auto now = temp.front(); temp.pop(); for (auto [v, w] : adj2[now]) { dp2[v] = min(dp2[v], dp2[now]); --in2[v]; if (in2[v] == 0) temp.emplace(v); } } } fami lore() { SPED; cin >> n >> m; cin >> s >> t; cin >> ss >> tt; for (int i = 1; i <= m; i++) { int l, r; lint w; cin >> l >> r >> w; adj[l].emplace_back(r, w); adj[r].emplace_back(l, w); edges.emplace_back(l, r, w); } dijkstra(s, sdist); dijkstra(t, tdist); dijkstra(ss, ssdist); dijkstra(tt, ttdist); for (auto [u, v, w] : edges) { if (sdist[u] + w + tdist[v] == sdist[t]) { adj1[u].emplace_back(v, w); in1[v]++; adj2[v].emplace_back(u, w); in2[u]++; } else if (sdist[v] + w + tdist[u] == sdist[t]) { adj1[v].emplace_back(u, w); in1[u]++; adj2[u].emplace_back(v, w); in2[v]++; } } fill(dp1 + 1, dp1 + 1 + n, INF); fill(dp2 + 1, dp2 + 1 + n, INF); topo1(); topo2(); lint ans = ssdist[tt]; for (int i = 1; i <= n; i++) ans = min(ans, min(dp1[i], dp2[i]) + ttdist[i]); cout << ans; } // Let your soul wander where dreams are born.
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...