Submission #1279735

#TimeUsernameProblemLanguageResultExecution timeMemory
1279735hanguyendanghuyCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
209 ms20212 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
constexpr ll MAXN=1e5+5,MAXV=3e5,MOD=1e9+7,INF=1e18;
ll n,m,i,j,p,k,ans,dem,st,en,dist[3][MAXN],S,T,U,V,len[MAXN],miV[MAXN],miU[MAXN];
vector<pair<ll,ll>> adj[MAXN];
void dij(ll st,ll type){
    priority_queue<pair<ll,ll>> q;
    dist[type][st]=0;
    q.push({0,st});
    while(q.size()){
        auto k=q.top();q.pop();
        if(-k.fi>dist[type][k.se]) continue;
        for(auto x:adj[k.se]){
            if(dist[type][x.fi]>-k.fi+x.se){
                dist[type][x.fi]=-k.fi+x.se;
                q.push({-dist[type][x.fi],x.fi});
            }
        }
    }
}
void solve(ll st,ll en){
    vector<ll> len(n + 1, INF);
    vector<ll> miU(n + 1, INF);
    vector<ll> miV(n + 1, INF);
    len[st]=0;
    miU[st]=dist[1][st];
    miV[st]=dist[2][st];
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> q;
    q.push({0, st});
    while (!q.empty()) {
        auto cur = q.top(); q.pop();
        if (cur.first > len[cur.se]) continue; 

        for (auto &e : adj[cur.se]) {
            if (cur.first+e.se < len[e.fi]) {
                len[e.fi] = cur.first+e.se;
                miU[e.fi] = min(miU[cur.se], dist[1][e.fi]);
                miV[e.fi] = min(miV[cur.se], dist[2][e.fi]);
                q.push({len[e.fi], e.fi});
            } 
            else if (cur.first+e.se == len[e.fi]) {
                if (min(miU[cur.se], dist[1][e.fi]) + min(miV[cur.se], dist[2][e.fi]) < miU[e.fi] + miV[e.fi]) {
                    miU[e.fi] = min(miU[cur.se], dist[1][e.fi]);
                    miV[e.fi] = min(miV[cur.se], dist[2][e.fi]);
                    q.push({len[e.fi], e.fi});
                }
            }
        }
    }
    if(len[en]!=INF){
        ans=min(ans,miU[en]+miV[en]);
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m>>S>>T>>U>>V;
    for(i=1;i<=m;i++){
        ll u,v,c;
        cin>>u>>v>>c;
        adj[u].pb({v,c});
        adj[v].pb({u,c});
    }
    for(i=1;i<=n;i++) dist[1][i]=dist[2][i]=INF;
    dij(U,1);
    dij(V,2);
    ans=dist[1][V];
    solve(S,T);
    solve(T,S);
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...