Submission #1241953

#TimeUsernameProblemLanguageResultExecution timeMemory
1241953khanhttCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
222 ms14472 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (ll)1e18;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    vector<vector<pair<int,int>>> adj(n+1);
    for(int i = 0; i < m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        adj[a].emplace_back(b,c);
        adj[b].emplace_back(a,c);
    }

    // Standard Dijkstra from a single source.
    auto dijkstra = [&](int src){
        vector<ll> dist(n+1, INF);
        priority_queue<pair<ll,int>,
                       vector<pair<ll,int>>,
                       greater<>> pq;
        dist[src] = 0;
        pq.push({0, src});
        while(!pq.empty()){
            auto [d, x] = pq.top(); pq.pop();
            if(d > dist[x]) continue;
            for(auto [y, w] : adj[x]){
                if(d + w < dist[y]){
                    dist[y] = d + w;
                    pq.push({dist[y], y});
                }
            }
        }
        return dist;
    };

    auto du = dijkstra(u);
    auto dv = dijkstra(v);
    auto ds = dijkstra(s);

    // If t is unreachable from s, no valid path:
    if(ds[t] == INF){
        cout << "-1\n";
        return 0;
    }

    // DP arrays: bestU[i], bestV[i] = 
    //   the minimal possible (min du on s→i + min dv on s→i) 
    //   if you choose the "worst" path deliberately.
    vector<ll> bestU(n+1, INF), bestV(n+1, INF);

    // Base at s:
    bestU[s] = du[s];
    bestV[s] = dv[s];

    // Sort nodes by increasing ds[]
    vector<int> order(n);
    iota(order.begin(), order.end(), 1);
    sort(order.begin(), order.end(),
         [&](int a, int b){ return ds[a] < ds[b]; });

    // Relax along the DAG of shortest‐path edges,
    // but *minimize* bestU+bestV instead of maximize.
    for(int x : order){
        if(bestU[x] == INF) continue;  // no s→x path in our DP
        for(auto [y, w] : adj[x]){
            if(ds[x] + w == ds[y]) {
                ll candU = min(bestU[x], du[y]);
                ll candV = min(bestV[x], dv[y]);
                if(candU + candV < bestU[y] + bestV[y]){
                    bestU[y] = candU;
                    bestV[y] = candV;
                }
            }
        }
    }

    // Output the *minimum* sum of the two minima on any shortest s→t:
    cout << (bestU[t] + bestV[t]) << "\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...