제출 #1188714

#제출 시각아이디문제언어결과실행 시간메모리
1188714prism7kCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
331 ms19764 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; vector<vector<pair<int, int>>> adj; vector<ll> d[3], dp[2]; const ll INF = 2e16; int main() { int N, M, S, T, U, V; cin >> N >> M >> S >> T >> U >> V; adj.resize(N + 1); d[0].assign(N + 1, INF); d[1].assign(N + 1, INF); d[2].assign(N + 1, INF); dp[0].assign(N + 1, INF); dp[1].assign(N + 1, INF); for(int i = 0, u, v, w; i < M; ++i) { cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } function<void(int, int)> dj1 = [&](int start, int idx) { priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> q; vector<bool> vis(N + 1, false); q.push({0LL, start}); while(!q.empty()) { auto[cur_weight, u] = q.top(); q.pop(); if(vis[u]) continue; vis[u] = true; d[idx][u] = cur_weight; for(auto[v, w] : adj[u]) { q.push({cur_weight + w, v}); } } }; dj1(U, 0); dj1(V, 1); ll ans = d[0][V]; function<void()> dj2 = [&] { priority_queue<tuple<ll, int, int>, vector<tuple<ll, int, int>>, greater<>> q; vector<bool> vis(N + 1, false); q.push({0LL, S, 0}); while(!q.empty()) { auto[cur_weight, u, p] = q.top(); q.pop(); if(!vis[u]) { vis[u] = true; d[2][u] = cur_weight; dp[0][u] = min(d[0][u], dp[0][p]); dp[1][u] = min(d[1][u], dp[1][p]); for(auto[v, w] : adj[u]) { q.push({cur_weight + w, v, u}); } } else if(cur_weight == d[2][u]) { if( (min(d[0][u], dp[0][p]) + min(d[1][u], dp[1][p])) <= dp[0][u] + dp[1][u] ) { dp[0][u] = min(d[0][u], dp[0][p]); dp[1][u] = min(d[1][u], dp[1][p]); } } } ans = min(ans, dp[0][T] + dp[1][T]); }; dj2(); cout << ans << "\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...