Submission #1089711

#TimeUsernameProblemLanguageResultExecution timeMemory
1089711ocasuCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
439 ms30484 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
int n,m,s,t,u,v; 

vector<vector<pair<int,int>>> adj;

vector<int> distU, distV, dpForward, dpBackward, distS, distT, dS, dT;

void dijkstra1(int node, vector<int>& dist){
    priority_queue<pair<int,int>> pq;
    pq.push({0,node});
    while(!pq.empty()){
        int x=pq.top().second; int d = -pq.top().first; pq.pop();
        if (dist[x] != -1) continue;
        dist[x] = d;
        for (auto [y,w]: adj[x]){
            int tmp=w+d;
            pq.push({-tmp, y});
        }
    }
}


signed main(){
    cin>>n>>m>>s>>t>>u>>v;
    adj.resize(n+1);
    for (int i=0; i<m; i++){
        int x,y,w; cin>>x>>y>>w;
        adj[x].push_back({y,w});
        adj[y].push_back({x,w});
    }
    distU.resize(n+1,-1), distV.resize(n+1, -1), distS.resize(n+1,-1), distT.resize(n+1,-1), dpForward.resize(n+1,-1), dpBackward.resize(n+1,-1);
    dS.resize(n+1,-1), dT.resize(n+1,-1);
    dijkstra1(u, distU);
    dijkstra1(v, distV);
    dijkstra1(s, dS);
    dijkstra1(t, dT);

    vector<bool> vF(n+1,false), vB(n+1,false);
    //now compute dpForward and dpBackward
    priority_queue<pair<int,int>> pq;
    pq.push({0,s});
    dpForward[s] = distV[s];
    while(!pq.empty()){
        auto [d, node] = pq.top();
        pq.pop();
        d*=-1;
        if (vF[node]) continue;
        vF[node]=true;
        for (auto [x,w]: adj[node]){
            int tmp=d+w;
            if (dT[x] != dT[node]-w) continue;

            if (distS[x]==-1){
                dpForward[x] = min(dpForward[node], distV[x]);
                distS[x] = tmp;
            } else if (distS[x] == tmp){
                dpForward[x] = min(dpForward[x], min(dpForward[node],distV[x]));
            } else if (tmp < distS[x]){
                dpForward[x] = min(dpForward[node], distV[x]);
                distS[x] = tmp;
            }
            pq.push({-tmp,x});
        }
    }
    
    pq.push({0,t});
    dpBackward[t] = distV[t];
    while(!pq.empty()){
        auto [d, node] = pq.top();
        pq.pop();
        d*=-1;
        if (vB[node]) continue;
        //cout<<node<<'\n';
        vB[node]=true;
        for (auto [x,w]: adj[node]){
            if (dS[x] != dS[node]-w) continue;

            int tmp=d+w;
            if (distT[x]==-1){
                dpBackward[x] = min(dpBackward[node], distV[x]);
                distT[x] = tmp;
            } else if (distT[x] == tmp){
                dpBackward[x] = min(dpBackward[x], min(dpBackward[node],distV[x]));
            } else if (tmp < distT[x]){
                dpBackward[x] = min(dpBackward[node], distV[x]);
                distT[x] = tmp;
            }
            pq.push({-tmp,x});
        }
    }
    //cout<<'\n';
    int ans=distU[v];
    for (int i=1; i<=n; i++){
        if (vF[i]==false or vB[i]==false) continue;
        //cout<<i<<' '<<dpForward[i]<<' '<<dpBackward[i]<<'\n';
        ans=min(ans, distU[i]+min(dpBackward[i],dpForward[i]));
    }
    cout<<ans<<'\n';


}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...