Submission #1370611

#TimeUsernameProblemLanguageResultExecution timeMemory
1370611Ekber_EkberCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
176 ms29076 KiB
#include <bits/stdc++.h>
// #ifndef ONLINE_JUDGE
//     #include <debug.h>
// #else
//     #define debug(...)
// #endif
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;

constexpr int MAX = 2e+5 + 1, INF = 2e+16, MOD = 1e+9 + 7, K = 31;
vector <pair<int, int>> g[MAX+2];

vector <int> dijkstra(int n, int s) {
    priority_queue <pair<int, int>, vector <pair<int, int>>, greater<pair<int, int>>> q;
    q.push({0, s});
    vector <int> dis(n+1, INF);
    dis[s] = 0;
    while (!q.empty()) {
        auto [d, u] = q.top();
        q.pop();
        if (d != dis[u]) continue;
        for (auto &[to, c] : g[u]) {
            if (dis[to] > d + c) {
                dis[to] = d + c;
                q.push({dis[to], to});
            }
        }
    }
    return dis;
}

vector <pair<int, int>> g1[MAX+2];
vector <int> ts, col(MAX+2, 0), par[MAX+2];

void dfs(int u) {
    col[u] = 1;
    for (auto &[i, c] : g1[u]) {
        if (col[i]) continue;
        dfs(i);
    }
    ts.pb(u);
}

void _() {
    int n, m;
    cin >> n >> m;
    int S, T, U, V;
    cin >> S >> T >> U >> V;
    vector <array <int, 3>> e;
    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        g[a].pb({b, c});
        g[b].pb({a, c});
        e.pb({a, b, c});
    }
    vector <int> ds, dt, du, dv;
    ds = dijkstra(n, S);
    dt = dijkstra(n, T);
    du = dijkstra(n, U);
    dv = dijkstra(n, V);
    for (auto &[a, b, c] : e) {
        if (ds[a] + c + dt[b] == ds[T]) {
            g1[a].pb({b, c});
            par[b].pb(a);
        }
        else if (ds[b] + c == dt[a]) {
            g1[b].pb({a, c});
            par[a].pb(b);
        }
    }
    for (int i = 1; i <= n; i++) {
        if (!col[i]) dfs(i);
    }
    reverse(all(ts));
    vector <int> dp = du;
    int res = du[V];
    for (int &i : ts) {
        for (int &j : par[i]) {
            dp[i] = min(dp[i], dp[j]);
        }
        res = min(res, dp[i] + dv[i]);
    }
    dp = dv;
    for (int &i : ts) {
        for (int &j : par[i]) {
            dp[i] = min(dp[i], dp[j]);
        }
        res = min(res, dp[i] + du[i]);
    }
    cout << res;
}

signed main() {

    GOOD_LUCK

    int tests=1;
    // cin >> tests;
    for (int i=1; i <= tests; i++) {
        _();
        cout << endl;
    }

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...