Submission #1342798

#TimeUsernameProblemLanguageResultExecution timeMemory
1342798prikpaoCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
1104 ms327680 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#define pii pair<int, int>
#define t3 tuple<int, int, int>
#define pepperX ios_base::sync_with_stdio(false); cin.tie(0);
using ll = long long;
using namespace std;
#define int ll

struct A{
    int a, w;
    bool operator<(const A& o)const{
        return w>o.w;
    }
};

struct B{
    int a, w, fu, fv;
    bool operator<(const B& o)const{
        if(w!=o.w)return w>o.w;
        return fu+fv>o.fu+o.fv;
    }
};


vector<A> g[100005];
int dis[100005], fare[100005];
int du[100005], dv[100005];

void solve(){
    int n, m, s, t, U, V;
    cin >> n >> m;
    cin >> s >> t;
    cin >> U >> V;
    for(int i=1; i<=m; i++){
        int a, b, w;
        cin >> a >> b >> w;
        g[a].push_back({b, w});
        g[b].push_back({a, w});
    }
    //==================distance from U and V=======================
    fill(du+1, du+n+1, 1e18);
    fill(dv+1, dv+n+1, 1e18);
    priority_queue<A> pq;
    pq.push({U, 0});
    du[U]=0;
    while(!pq.empty()){
        auto [u,w]=pq.top();
        pq.pop();

        if(w>du[u])continue;

        for(auto [v,ww]:g[u]){
            if(w+ww<du[v]){
                du[v]=w+ww;
                pq.push({v, w+ww});
            }
        }
    }
    pq.push({V, 0});
    dv[V]=0;
    while(!pq.empty()){
        auto [u,w]=pq.top();
        pq.pop();

        if(w>dv[u])continue;

        for(auto [v,ww]:g[u]){
            if(w+ww<dv[v]){
                dv[v]=w+ww;
                pq.push({v, w+ww});
            }
        }
    }
    //========================================
    fill(dis+1, dis+n+1, 1e18);
    fill(fare+1, fare+n+1, 1e18);
    priority_queue<B> pq2;
    pq2.push({s, 0, du[s], dv[s]});
    dis[s]=0;
    fare[s]=du[s]+dv[s];
    while(!pq2.empty()){
        auto [u,w,fu,fv]=pq2.top();
        pq2.pop();

        if(w>dis[u] || fu+fv>fare[u])continue;
        if(u==t){
            cout << min(fu+fv, du[V]);
            return;
        }

        for(auto [v,ww]:g[u]){
            int nfu=min(fu, du[v]);
            int nfv=min(fv, dv[v]);
            if(w+ww<dis[v] || (w+ww==dis[v] && nfu+nfv<fare[v])){
                dis[v]=w+ww;
                pq2.push({v, w+ww, nfu, nfv});
            }
        }
    }
}

int32_t main(){
    pepperX;
    int tcs=1;
    //cin >> tcs;
    while(tcs--) solve();
    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...