Submission #1275337

#TimeUsernameProblemLanguageResultExecution timeMemory
1275337almazCommuter Pass (JOI18_commuter_pass)C++20
24 / 100
2096 ms26624 KiB
#include <bits/stdc++.h> using namespace std; #define int long long // #define endl '\n' #define ff first #define ss second #define pb push_back #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define ar array const int MOD = 1e9 + 7,INF = 1e18, N = 2e5 + 5; /* 5 2 1 2 2 2 3 2 3 4 2 4 5 2 */ void solve(){ int n, m; cin >> n >> m; int s, t, u, v; cin >> s >> t >> u >> v; int ans = INF; vector <vector <pair<int,int>>> g(n +1); for(int i = 0;i < m;i++){ int a, b, c; cin >> a >> b >> c; g[a].pb({b, c}); g[b].pb({a, c}); } vector <vector <int>> p(n + 1); { vector <int> cnt(n + 1, INF); cnt[s] = 0; set <pair<int,int>> st; st.insert({0 , s}); while(!st.empty()){ int x = st.begin() -> ss; st.erase(st.begin()); for(auto [i , c] : g[x]){ if(cnt[i] > cnt[x] + c){ cnt[i] = cnt[x] + c; p[i].clear(); p[i].pb(x); st.insert({cnt[i] , i}); } else if(cnt[i] == cnt[x] + c){ p[i].pb(x); } } } } vector <int> b; b.pb(t); queue <int> q; q.push(t); vector <int> used(n + 1); while(!q.empty()){ int x = q.front(); q.pop(); // cout<<x<<endl; for(int i : p[x]){ if(!used[i]){ used[i] = 1; q.push(i); b.pb(i); } } } vector <int> cntu(n + 1, INF) , cntv(n + 1, INF); { cntu[u] = 0; set <pair<int,int>> st; st.insert({0 , u}); while(!st.empty()){ int x = st.begin() -> ss; st.erase(st.begin()); for(auto [i , c] : g[x]){ if(cntu[i] > cntu[x] + c){ cntu[i] = cntu[x] + c; st.insert({cntu[i] , i}); } } } } { cntv[v] = 0; set <pair<int,int>> st; st.insert({0 , v}); while(!st.empty()){ int x = st.begin() -> ss; st.erase(st.begin()); for(auto [i , c] : g[x]){ if(cntv[i] > cntv[x] + c){ cntv[i] = cntv[x] + c; st.insert({cntv[i] , i}); } } } } ans = min(ans , cntu[v]); for(int i = 0;i < (int)b.size();i++){ for(int j = i + 1;j < (int)b.size();j++){ int f = 0; int h = b[i]; int y = b[j]; { queue <int> qi; qi.push(h); vector <int> us(n + 1); while(!qi.empty()){ int x = qi.front(); qi.pop(); for(int i : p[x]){ if(!us[i]){ if(i == y){ f = 1; } qi.push(i); us[i] = 1; } } } } { queue <int> qi; qi.push(y); vector <int> us(n + 1); while(!qi.empty()){ int x = qi.front(); qi.pop(); for(int i : p[x]){ if(!us[i]){ if(i == h){ f = 1; } qi.push(i); us[i] = 1; } } } } if(f){ // cout<<"HERE"<<endl; // cout<<h<<' '<<y<<endl; // cout<<cntv[h]<<' '<<cntu[y]<<endl<<cntu[h]<<' '<<cntv[y]<<endl<<endl; ans = min(ans , cntu[h] + cntv[y]); ans = min(ans , cntu[y] + cntv[h]); } } } cout<<ans<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int ti = 1; while (ti--) { 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...