Submission #1356628

#TimeUsernameProblemLanguageResultExecution timeMemory
1356628njoopCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
243 ms33576 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

vector<vector<pair<int, int>>> g;
vector<vector<int>> g2;
vector<tuple<int, int, int>> edge;
vector<int> ds, dt, du, dv, dp, top, in;
int n, m, s, t, u, v, ans=1e18;
set<int> li;

void dijkstra(int stn, vector<vector<pair<int, int>>> &g, vector<int> &d) {
    d.assign(n+2, 1e18);
    d[stn] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, stn});
    while(!pq.empty()) {
        int cd = pq.top().first, cn = pq.top().second;
        pq.pop();
        for(auto i: g[cn]) {
            int nn = i.first, nd = cd+i.second;
            if(d[nn] <= nd) continue;
            d[nn] = nd;
            pq.push({nd, nn});
        }
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m >> s >> t >> u >> v;
    g.assign(n+2, vector<pair<int, int>>());
    g2.assign(n+2, vector<int>());
    in.assign(n+2, 0);
    while(m--) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].push_back({v, w});
        g[v].push_back({u, w});
        edge.push_back({u, v, w});
    }
    dijkstra(s, g, ds);
    dijkstra(t, g, dt);
    dijkstra(u, g, du);
    dijkstra(v, g, dv);
    int sp = ds[t];
    for(auto i: edge) {
        int u = get<0>(i), v = get<1>(i), w = get<2>(i);
        if(ds[u] + dt[v] + w == sp) {
            g2[u].push_back(v);
            in[v]++;
            li.insert(u);
            li.insert(v);
        }
        if(ds[v] + dt[u] + w == sp) {
            g2[v].push_back(u);
            in[u]++;
            li.insert(u);
            li.insert(v);
        }
    }
    deque<int> cli;
    for(auto i: li) {
        if(in[i] == 0) {
            cli.push_back(i);
            top.push_back(i);
        }
    }
    while(!cli.empty()) {
        int cn = cli.front();
        cli.pop_front();
        for(auto i: g2[cn]) {
            in[i]--;
            if(in[i] == 0) {
                cli.push_back(i);
                top.push_back(i);
            }
        }
    }
    ans = du[v];
    dp.assign(n+2, 1e18);
    for(int i: top) {
        dp[i] = min(dp[i], du[i]);
        ans = min(ans, dp[i]+dv[i]);
        for(auto j: g2[i]) {
            dp[j] = min(dp[j], dp[i]);
        }
    }
    dp.assign(n+2, 1e18);
    for(int i: top) {
        dp[i] = min(dp[i], dv[i]);
        ans = min(ans, dp[i]+du[i]);
        for(auto j: g2[i]) {
            dp[j] = min(dp[j], dp[i]);
        }
    }
    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...