Submission #1322343

#TimeUsernameProblemLanguageResultExecution timeMemory
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...