제출 #1322343

#제출 시각아이디문제언어결과실행 시간메모리
1322343ljlkjCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
428 ms24640 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 7; vector<pair<int , ll>> adj[N]; int n , m , s , t , u , v; void getInput(){ cin >> n >> m >> s >> t >> u >> v; s-- , t-- , u-- , v--; for(int i = 0; i < m; i++){ int u , v; ll w; cin >> u >> v >> w; u-- , v--; adj[u].push_back({v , w}); adj[v].push_back({u , w}); } } ll bestX[N]; ll bestVX[N]; vector<ll> du , dv , dt , ds; vector<ll> dijkstra(int src){ vector<ll> d(n , 1e18); for(int i = 0; i < n; i++) bestX[i] = 1e18; for(int i = 0; i < n; i++) bestVX[i] = 1e18; set<pair<ll , pair<int , int>>> que; que.insert({0 , {src , -1}}); while(que.size() > 0){ pair<ll , pair<int , int>> first = *(que.begin()); que.erase(que.begin()); int u = first.second.first; int par = first.second.second; ll w = first.first; if(w > d[u]) continue; if(w < d[u]){ d[u] = w; for(auto v: adj[u]){ if(d[v.first] == (ll)1e18) que.insert({d[u] + v.second , {v.first , u}}); } } if(par != -1){ bestX[u] = min({bestX[u] , bestX[par] , du[par]}); bestVX[u] = min({bestVX[u] , bestVX[par] , dv[par]}); } } return d; } void calcShortPaths(){ du.resize(n , 1e18); dv.resize(n , 1e18); du = dijkstra(u); dv = dijkstra(v); dt = dijkstra(t); ds = dijkstra(s); } ll solve(){ ll ans = du[v]; for(int i = 0; i < n; i++){ if(ds[t] != ds[i] + dt[i]) continue; // it is not a valid y ans = min(ans , bestX[i] + dv[i]); ans = min(ans , bestVX[i] + du[i]); } return ans; } int main(){ ios_base::sync_with_stdio(0) , cin.tie(0) , cout.tie(0); getInput(); calcShortPaths(); cout << solve() << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...