Submission #1141617

#TimeUsernameProblemLanguageResultExecution timeMemory
1141617KK_1729Commuter Pass (JOI18_commuter_pass)C++17
100 / 100
392 ms27972 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define pb push_back #define all(a) a.begin(), a.end() #define endl "\n" void printVector(vector<int> a){ for (auto x: a) cout << x << " "; cout << endl; } vector<vector<pair<int, int>>> graph; vector<int> distu; vector<int> distv; vector<int> dp1; vector<int> dp2; void dijkstra(int s, int n, vector<int> &arr){ arr[s] = 0; priority_queue<pair<int, int>> pq; pq.push({0, s}); vector<int> visited(n+1); while (!pq.empty()){ int c, node; tie(c, node) = pq.top(); pq.pop(); if (!visited[node]){ arr[node] = -c; visited[node] = 1; for (auto x: graph[node]) pq.push({c-x.second, x.first}); } } } int ans = 1e17; void dijkstra2(int s, int e, int n){ vector<int> visited(n+1); vector<int> ds(n+1, 1e17); dp1.resize(n+1, 1e17); dp2.resize(n+1, 1e17); priority_queue<pair<int, pair<int, int>>> pq; pq.push({0, {s, 0}}); while (!pq.empty()){ int c, node, par; pair<int, int> p; tie(c, p) = pq.top(); pq.pop(); tie(node, par) = p; if (!visited[node]){ visited[node] = 1; ds[node] = -c; dp1[node] = min(distu[node], dp1[par]); dp2[node] = min(distv[node], dp2[par]); for (auto x: graph[node]) pq.push({c-x.second, {x.first, node}}); }else if (-c == ds[node]){ if (min(distu[node], dp1[par])+min(distv[node], dp2[par]) <= dp1[node]+dp2[node]){ dp1[node] = min(distu[node], dp1[par]); dp2[node] = min(distv[node], dp2[par]); } } } ans = min(ans, dp1[e]+dp2[e]); } void solve(){ int n, m; cin >> n >> m; int s, t; cin >> s >> t; int u, v; cin >> u >> v; graph.resize(n+1); distu.resize(n+1, 1e17); distv.resize(n+1, 1e17); dp1.resize(n+1, 1e17); dp2.resize(n+1, 1e17); FOR(i,0,m){ int a, b, c; cin >> a >> b >> c; graph[a].pb({b, c}); graph[b].pb({a, c}); } dijkstra(u, n, distu); dijkstra(v, n, distv); ans = distu[v]; dijkstra2(s, t, n); dp1.clear(); dp2.clear(); dijkstra2(t, s, n); cout << ans << endl; } int32_t main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int t = 1; // cin >> t; while (t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...