Submission #1297587

#TimeUsernameProblemLanguageResultExecution timeMemory
1297587jahongirCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
299 ms19976 KiB
// #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using ordered_set = tree<T,null_type,less_equal<T>,rb_tree_tag, tree_order_statistics_node_update>; #define ll long long #define pi pair<int,int> #define vi vector<int> #define pb push_back #define all(a) a.begin(),a.end() const ll inf = 1e18; const int mxn = 1e5+1; vector<pi> g[mxn]; vector<int> g2[mxn]; bool vis[mxn]; int n,m; void dijskitra(int s, vector<ll> &vec){ priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq; vec[s] = 0; pq.push({0,s}); while(!pq.empty()){ auto [d,u] = pq.top(); pq.pop(); if(vec[u]!=d) continue; for(auto [v,c] : g[u]) if(vec[v] > d+c) pq.push({vec[v]=d+c,v}); } } vector<int> topo; void dfs(int u){ vis[u] = 1; for(auto v : g2[u]) if(!vis[v]) dfs(v); topo.push_back(u); } void solve(){ cin >> n >> m; int s,t,s2,t2; cin >> s >> t; cin >> s2 >> t2; for(int i = 1; i <= m; i++){ int u,v,c; cin >> u >> v >> c; g[u].pb({v,c}); g[v].pb({u,c}); } vector<ll> dps(n+1,inf); dijskitra(s,dps); vector<ll> dpt(n+1,inf); dijskitra(t,dpt); vector<ll> dps2(n+1,inf); dijskitra(s2,dps2); vector<ll> dpt2(n+1,inf); dijskitra(t2,dpt2); fill(vis+1,vis+n+1,true); for(int u = 1; u <= n; u++) for(auto [v,c] : g[u]) if(dps[u] + c + dpt[v] == dps[t]){ g2[u].push_back(v); vis[u] = vis[v] = false; } for(int i = 1; i <= n; i++) if(!vis[i]) dfs(i); ll ans = dps2[t2]; for(auto u : topo){ ll dp0 = dps2[u], dp1 = dpt2[u]; for(auto v : g2[u]) dp0 = min(dp0,dps2[v]), dp1 = min(dp1,dpt2[v]); ans = min(ans,dp0 + dpt2[u]); ans = min(ans,dp1 + dps2[u]); dps2[u] = dp0; dpt2[u] = dp1; } cout << ans; } signed main(){ cin.tie(0)->sync_with_stdio(0); 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...