Submission #1336807

#TimeUsernameProblemLanguageResultExecution timeMemory
1336807ASGA_RedSeaCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
321 ms29844 KiB
/**

                                    * بسم الله الرحمن الرحيم *

                ﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿

*/

/// author : ASGA"


#pragma GCC optimize("Ofast")

#include<bits/stdc++.h>


using namespace std;

using ll=long long;
using lll=__int128;
using ld=long double;

const ll inf=1e18;


void dij(int N,vector<ll>&d,const vector<vector<array<ll,2>>>&a){
    d[N]=0;
    priority_queue<array<ll,2>,vector<array<ll,2>>,greater<array<ll,2>>>q;

    q.push({0,N});

    while(!q.empty()){
        ll i=q.top()[1],w=q.top()[0];q.pop();
        for(auto&[j,c]:a[i]){
            if(w+c<d[j]){
                d[j]=w+c;
                q.push({d[j],j});
            }
        }
    }
}


signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);



    int n,m;cin>>n>>m;
    int S,T,U,V;cin>>S>>T>>U>>V;
    S--;T--;U--;V--;

    vector<vector<array<ll,2>>>a(n);
    vector<array<ll,3>>e;
    while(m--){
        int u,v,c;cin>>u>>v>>c;u--;v--;
        a[u].push_back({v,c});
        a[v].push_back({u,c});
        e.push_back({u,v,c});
    }

    vector<ll>ds(n,inf),du(n,inf),dv(n,inf);

    dij(S,ds,a);
    dij(U,du,a);
    dij(V,dv,a);

    vector<vector<int>>g(n);

    for(auto&[i,j,c]:e){
        if(ds[i]>ds[j])swap(i,j);
        if(ds[i]+c==ds[j])g[i].push_back(j);
    }


    ll ans=du[V];
    vector<int>v(n,-1);
    auto c=[&](int i,auto&c)->int{
        int&r=v[i];
        if(i==T)return (r=1);

        if(r==-1){
            r=0;
            for(int&j:g[i])r|=c(j,c);
        }
        return r;
    };
    c(S,c);

    vector<ll>vl(n,-1);
    auto cc=[&](int i,auto&cc)->ll{
        ll&r=vl[i];
        if(v[i]!=1)return(r=inf);

        if(r==-1){
            r=dv[i];
            for(int&j:g[i])r=min(r,cc(j,cc));

            ans=min(ans,r+du[i]);
        }

        return r;
    };
    cc(S,cc);


    vl=vector<ll>(n,-1);
    auto cc1=[&](int i,auto &cc1)->ll{
        ll&r=vl[i];
        if(v[i]!=1)return(r=inf);

        if(r==-1){
            r=du[i];
            for(int&j:g[i])r=min(r,cc1(j,cc1));

            ans=min(ans,r+dv[i]);
        }

        return r;
    };
    cc1(S,cc1);


    cout<<ans<<'\n';




    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...