Submission #1291297

#TimeUsernameProblemLanguageResultExecution timeMemory
1291297nathlol2Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
223 ms37816 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int n, m, s, t, ss, tt, ans = 4e18, dist[4][N], dp[N], dp1[N], vis[N];
tuple<int, int, int> ed[N];
vector<pair<int, int>> g[N];
vector<int> dag[N], rv[N];
void dij(int st, int id){
    for(int i = 0;i<N;i++) dist[id][i] = 4e18;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    dist[id][st] = 0;
    pq.push({0, st});
    while(!pq.empty()){
        auto [d, u] = pq.top();
        pq.pop();
        if(d > dist[id][u]) continue;
        for(auto [v, w] : g[u]){
            if(d + w < dist[id][v]){
                dist[id][v] = d + w;
                pq.push({d + w, v});
            }
        }
    }
}

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

    cin >> n >> m >> s >> t >> ss >> tt;
    for(int i = 0;i<m;i++){
        auto &[u, v, w] = ed[i];
        cin >> u >> v >> w;
        g[u].push_back({v, w});
        g[v].push_back({u, w});
    }
    dij(s, 0);
    dij(t, 1);
    dij(ss, 2);
    dij(tt, 3);
    // for(int i = 0;i<4;i++){
    //     for(int j = 1;j<=n;j++){
    //         cout << dist[i][j] << ' ';
    //     }
    //     cout << '\n';
    // }
    for(int i = 0;i<m;i++){
        auto [u, v, w] = ed[i];
        if(dist[0][u] + w + dist[1][v] == dist[0][t]){
            dag[u].push_back(v);
            rv[v].push_back(u);
        }
        if(dist[0][v] + w + dist[1][u] == dist[0][t]){
            dag[v].push_back(u);
            rv[u].push_back(v);
        }
    }
    vector<int> od(n);
    iota(od.begin(), od.end(), 1);
    sort(od.begin(), od.end(),[&](int a, int b) {return dist[0][a] > dist[0][b];});
    int ans = 4e18;
    for(auto u : od){
        dp[u] = 4e18;
        dp1[u] = 4e18;
        for(int v : dag[u]){
            dp[u] = min(dp[u],  dp[v]);
            dp1[u] = min(dp1[u], dp1[v]);
        }
        dp[u] = min(dp[u], dist[3][u]);
        dp1[u] = min(dp1[u], dist[2][u]);
        if(dist[2][u] < 4e18 && dp[u] < 4e18){
            ans = min(ans, dist[2][u] + dp[u]);
        }
        if(dist[3][u] < 4e18 && dp1[u] < 4e18){
            ans = min(ans, dist[3][u] + dp1[u]);
        }
    }
    ans = min(ans, dist[2][tt]);
    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...