Submission #532541

#TimeUsernameProblemLanguageResultExecution timeMemory
532541rk42745417Commuter Pass (JOI18_commuter_pass)C++17
100 / 100
342 ms23604 KiB
#include <bits/stdc++.h> using namespace std; #define EmiliaMyWife ios::sync_with_stdio(0); cin.tie(0); using ll = int64_t; using uint = uint32_t; using ull = uint64_t; using ld = long double; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; const double EPS = 1e-8; const ll LINF = ll(4e18) + ll(2e15); static int LamyIsCute = []() { EmiliaMyWife return 48763; }(); signed main() { int n, m, s, t, a, b; cin >> n >> m >> s >> t >> a >> b; vector<vector<pair<int, int>>> edge(n + 1); while(m--) { int u, v, c; cin >> u >> v >> c; edge[u].push_back({v, c}); edge[v].push_back({u, c}); } auto dijk = [&](vector<ll> &dis, int st) { dis.resize(n + 1, LINF); dis[st] = 0; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; pq.push({0, st}); while(!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if(d > dis[u]) continue; for(const auto &[v, c] : edge[u]) if(dis[v] > dis[u] + c) dis[v] = dis[u] + c, pq.push({dis[v], v}); } }; vector<ll> diss, dist; dijk(diss, s); dijk(dist, t); const ll mn = diss[t]; vector<array<ll, 4>> ans(n + 1, {LINF, LINF, LINF, LINF}); ans[a][0] = 0; priority_queue<tuple<ll, int, int>, vector<tuple<ll, int, int>>, greater<tuple<ll, int, int>>> pq; pq.push({0, a, 0}); while(!pq.empty()) { auto [d, u, w] = pq.top(); pq.pop(); if(d > ans[u][w]) continue; //cerr << "xdd " << u << ' ' << w << ' ' << d << '\n'; //cerr << "owo " << u << ' ' << diss[u] << ' ' << dist[u] << '\n'; for(const auto &[v, c] : edge[u]) { if((w == 0 || w == 3) && ans[v][w] > ans[u][w] + c) { ans[v][w] = ans[u][w] + c; pq.push({ans[v][w], v, w}); } if((w == 1 || w == 2) && ans[v][3] > ans[u][w] + c) { ans[v][3] = ans[u][w] + c; pq.push({ans[v][3], v, 3}); } if((w == 0 || w == 1) && diss[u] + dist[u] == mn && diss[v] + dist[v] == mn && diss[v] - diss[u] == c) { if(ans[v][1] > ans[u][w]) { ans[v][1] = ans[u][w]; pq.push({ans[v][1], v, 1}); } } if((w == 0 || w == 2) && diss[u] + dist[u] == mn && diss[v] + dist[v] == mn && diss[u] - diss[v] == c) { if(ans[v][2] > ans[u][w]) { ans[v][2] = ans[u][w]; pq.push({ans[v][2], v, 2}); } } } } cout << min({ans[b][0], ans[b][1], ans[b][2], ans[b][3]}) << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...