Submission #1322186

#TimeUsernameProblemLanguageResultExecution timeMemory
1322186yessimkhanCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
499 ms35576 KiB
#include <bits/stdc++.h>
// solved by bekagg
#define int long long
#define ent '\n'
#define pb push_back
#define all(x) x.begin(),x.end()
#define PRaim_bek_abi ios_base::sync_with_stdio(0);cin.tie(0);

using namespace std;

const int N = 2e5+5;
const int MOD = 1e9+7;

int n , m , ds[N] , dt[N] , du[N] , dv[N] , x[N] , y[N] , w[N] , cnt[N] , ans = 10000000000000000 , dp[N][2];
bool us[N];
vector<pair<int , int>> g[N];
vector<int> d[N] , o[N];

void create_ds(int start){

    for (int i = 1; i <= n; i++) ds[i] = dt[i] = du[i] = dv[i] = dp[i][0] = dp[i][1] = 10000000000000000;

    set< pair<int , int> > st;
    ds[start] = 0;
    st.insert({0 , start});

    while(!st.empty()){
        int v = (*st.begin()).second;
        st.erase(st.begin());

        for (auto [to , c] : g[v]){
            if (ds[to] > ds[v] + c){
                if (st.find({ds[to] , to}) != st.end()) st.erase(st.find({ds[to] , to}));
                ds[to] = ds[v] + c;
                st.insert({ds[to] , to});
            }
        }
    }

}

void create_dt(int start){

    dt[start] = 0;
    set< pair<int , int> > st;
    st.insert({0 , start});

    while(!st.empty()){
        int v = (*st.begin()).second;
        st.erase(st.begin());

        for (auto [to , c] : g[v]){
            if (dt[to] > dt[v] + c){
                if (st.find({dt[to] , to}) != st.end()) st.erase(st.find({dt[to] , to}));
                dt[to] = dt[v] + c;
                st.insert({dt[to] , to});
            }
        }
    }
}

void create_du(int start){

    du[start] = 0;
    set< pair<int , int> > st;
    st.insert({0 , start});

    while(!st.empty()){
        int v = (*st.begin()).second;
        st.erase(st.begin());

        for (auto [to , c] : g[v]){
            if (du[to] > du[v] + c){
                if (st.find({du[to] , to}) != st.end()) st.erase(st.find({du[to] , to}));
                du[to] = du[v] + c;
                st.insert({du[to] , to});
            }
        }
    }
}

void create_dv(int start){

    dv[start] = 0;
    set< pair<int , int> > st;
    st.insert({0 , start});

    while(!st.empty()){
        int v = (*st.begin()).second;
        st.erase(st.begin());

        for (auto [to , c] : g[v]){
            if (dv[to] > dv[v] + c){
                if (st.find({dv[to] , to}) != st.end()) st.erase(st.find({dv[to] , to}));
                dv[to] = dv[v] + c;
                st.insert({dv[to] , to});
            }
        }
    }
}

void dfs(int v){
    dp[v][0] = min(dp[v][0] , du[v]);
    dp[v][1] = min(dp[v][1] , dv[v]);

    ans = min({ans , dp[v][0] + dv[v] , dp[v][1] + du[v]});

    for (auto to : d[v]){
        dp[to][0] = min(dp[to][0] , dp[v][0]);
        dp[to][1] = min(dp[to][1] , dp[v][1]);
        ++cnt[to];
        if (cnt[to] == o[to].size()) dfs(to);
    }
}

void arkanefury228(){
    int s , t , u , v;
    cin >> n >> m >> s >> t >> u >> v;
    
    for (int i = 1; i <= m; i++){
        cin >> x[i] >> y[i] >> w[i];
        g[x[i]].pb({y[i] , w[i]});
        g[y[i]].pb({x[i] , w[i]});
    }

    create_ds(s);
    create_dt(t);
    create_du(u);
    create_dv(v);

    for (int i = 1; i <= m; i++){

        if (ds[x[i]] > ds[y[i]]) swap(x[i] , y[i]);

        if (ds[t] == ds[x[i]] + dt[y[i]] + w[i]){
            d[x[i]].pb(y[i]);
            o[y[i]].pb(x[i]);
        }

    }

    dfs(s);
    
    cout << ans;
}

signed main(){

    PRaim_bek_abi

    int t=1;
    //cin>>t;
    for (int respagold = 1; respagold <= t; respagold++) arkanefury228();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...