Submission #1144516

#TimeUsernameProblemLanguageResultExecution timeMemory
1144516tntCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
413 ms33548 KiB
#include <bits/stdc++.h> using namespace std; //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") //#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3") #define pb push_back #define ll long long #define int long long //#define sort(all(v)) sort(v.begin(),v.end()) int mod = 998244353; const int N = 1e5 + 10; const int inf = 1e9; int fact[200001]; ll binpow(ll a, ll b){ if(b == 0) return 1; else if(b % 2 == 1) return (a * binpow(a, b - 1)) % mod; ll p = binpow(a,b / 2); return (p * p) % mod; } vector<int> d(N,1e18),d1(N,1e18),d2(N,1e18),d3(N,1e18); int was[N],dp[N][3]; vector <pair<int,int>> g[N]; vector <int> g1[N],top; void dfs(int u){ was[u] = 1; for(int to : g1[u]){ if(was[to] != 0) continue; dfs(to); } top.pb(u); } signed main(){ //freopen("mootube.in", "r", stdin); //freopen("mootube.out", "w", stdout); int n,m,s,t,u,v; cin >> n >> m >> s >> t >> u >> v; vector <array<int,3>> q; for(int i = 1; i <= m; i++){ int a,b,c; cin >> a >> b >> c; g[a].pb({b,c}); g[b].pb({a,c}); q.pb({a,b,c}); } set <pair<int,int>> st; st.insert({0,s}); d[s] = 0; while(st.size() > 0){ int u1 = (*st.begin()).second; st.erase(st.begin()); for(auto [to,w] : g[u1]){ if(d[to] > d[u1] + w){ st.erase({d[to],to}); d[to] = d[u1] + w; st.insert({d[to],to}); } } } st.insert({0,t}); d1[t] = 0; while(st.size() > 0){ int u1 = (*st.begin()).second; st.erase(st.begin()); for(auto [to,w] : g[u1]){ if(d1[to] > d1[u1] + w){ st.erase({d1[to],to}); d1[to] = d1[u1] + w; st.insert({d1[to],to}); } } } st.insert({0,u}); d2[u] = 0; while(st.size() > 0){ int u1 = (*st.begin()).second; st.erase(st.begin()); for(auto [to,w] : g[u1]){ if(d2[to] > d2[u1] + w){ st.erase({d2[to],to}); d2[to] = d2[u1] + w; st.insert({d2[to],to}); } } } st.insert({0,v}); d3[v] = 0; while(st.size() > 0){ int u1 = (*st.begin()).second; st.erase(st.begin()); for(auto [to,w] : g[u1]){ if(d3[to] > d3[u1] + w){ st.erase({d3[to],to}); d3[to] = d3[u1] + w; st.insert({d3[to],to}); } } } for(int i = 0; i < m; i++){ int a = q[i][0],b = q[i][1],c = q[i][2]; if(d[a] + d1[b] + c == d[t]){ g1[a].pb(b); } if(d[b] + d1[a] + c == d[t]){ g1[b].pb(a); } } dfs(s); for(int i = 0; i < top.size(); i++){ //cout << top[i] << ' '; dp[top[i]][1] = d3[top[i]]; dp[top[i]][2] = d2[top[i]]; for(auto to : g1[top[i]]){ dp[top[i]][1] = min(dp[top[i]][1],dp[to][1]); dp[top[i]][2] = min(dp[top[i]][2],dp[to][2]); //cout << to << " "; } } int ans = d2[v]; for(int i : top){ ans = min({ans,d2[i] + dp[i][1],d3[i] + dp[i][2]}); //cout << dp[i][1] << ' ' << dp[i][2] << " " << i << '\n'; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...