제출 #1291297

#제출 시각아이디문제언어결과실행 시간메모리
1291297nathlol2Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
223 ms37816 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 2e5 + 5; int n, m, s, t, ss, tt, ans = 4e18, dist[4][N], dp[N], dp1[N], vis[N]; tuple<int, int, int> ed[N]; vector<pair<int, int>> g[N]; vector<int> dag[N], rv[N]; void dij(int st, int id){ for(int i = 0;i<N;i++) dist[id][i] = 4e18; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; dist[id][st] = 0; pq.push({0, st}); while(!pq.empty()){ auto [d, u] = pq.top(); pq.pop(); if(d > dist[id][u]) continue; for(auto [v, w] : g[u]){ if(d + w < dist[id][v]){ dist[id][v] = d + w; pq.push({d + w, v}); } } } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m >> s >> t >> ss >> tt; for(int i = 0;i<m;i++){ auto &[u, v, w] = ed[i]; cin >> u >> v >> w; g[u].push_back({v, w}); g[v].push_back({u, w}); } dij(s, 0); dij(t, 1); dij(ss, 2); dij(tt, 3); // for(int i = 0;i<4;i++){ // for(int j = 1;j<=n;j++){ // cout << dist[i][j] << ' '; // } // cout << '\n'; // } for(int i = 0;i<m;i++){ auto [u, v, w] = ed[i]; if(dist[0][u] + w + dist[1][v] == dist[0][t]){ dag[u].push_back(v); rv[v].push_back(u); } if(dist[0][v] + w + dist[1][u] == dist[0][t]){ dag[v].push_back(u); rv[u].push_back(v); } } vector<int> od(n); iota(od.begin(), od.end(), 1); sort(od.begin(), od.end(),[&](int a, int b) {return dist[0][a] > dist[0][b];}); int ans = 4e18; for(auto u : od){ dp[u] = 4e18; dp1[u] = 4e18; for(int v : dag[u]){ dp[u] = min(dp[u], dp[v]); dp1[u] = min(dp1[u], dp1[v]); } dp[u] = min(dp[u], dist[3][u]); dp1[u] = min(dp1[u], dist[2][u]); if(dist[2][u] < 4e18 && dp[u] < 4e18){ ans = min(ans, dist[2][u] + dp[u]); } if(dist[3][u] < 4e18 && dp1[u] < 4e18){ ans = min(ans, dist[3][u] + dp1[u]); } } ans = min(ans, dist[2][tt]); 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...