Submission #1277332

#TimeUsernameProblemLanguageResultExecution timeMemory
1277332shirokitoCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
247 ms24308 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int N = 2e5 + 24;
const ll INF = 1e18;

int n, m, S, T, U, V;
vector<pair<ll, ll>> g[N];
vector<ll> distU, distV, distS;
ll dpU[N], dpV[N];

void gen_dist(int start, vector<ll> &dist) {
    dist.assign(n + 1, INF);
    dist[start] = 0;

    vector<bool> vis(n + 1, 0);

    multiset<pair<ll, ll>> mts;
    mts.insert({0, start});

    while (mts.size()) {
        auto node = *mts.begin();
        mts.erase(mts.find(node));
        int u = node.second;

        if (vis[u]) continue;
        vis[u] = 1;

        for (auto [v, w]: g[u]) {
            if (dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                mts.insert({dist[v], v});
            }
        }
    }

    // cout << start << '\n';
    // for  (int i = 1; i <= n; i++) {
    //     cout << i << ' ' << dist[i] << '\n';
    // }
}

void dfs(int u) {
    if (dpU[u] != INF) return;  
    dpU[u] = distU[u];
    dpV[u] = distV[u];

    for (auto [v, w]: g[u]) {
        if (distS[v] + w == distS[u]) {
            dfs(v);
            dpU[u] = min(dpU[u], dpU[v]);
            dpV[u] = min(dpV[u], dpV[v]);
        }
    }
}

void solve() {
    cin >> n >> m >> S >> T >> U >> V;

    for (int i = 1; i <= m; i++) {
        int u, v, w; cin >> u >> v >> w;
        g[u].push_back({v, w});
        g[v].push_back({u, w});
    }

    gen_dist(S, distS);
    gen_dist(U, distU);
    gen_dist(V, distV);

    fill(dpU, dpU + n + 1, INF);
    fill(dpV, dpV + n + 1, INF);

    dfs(T);

    ll res = distU[V];
    for (int i = 1; i <= n; i++) {
        res = min(res, dpU[i] + distV[i]);
        res = min(res, dpV[i] + distU[i]);
    }

    cout << res << '\n';
}

int main() {
    cin.tie(0) -> sync_with_stdio(0);

    int TC = 1; // cin >> TC;
    while (TC--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...