Submission #1299513

#TimeUsernameProblemLanguageResultExecution timeMemory
1299513t6stksCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
225 ms29288 KiB
#include <bits/stdc++.h>
#define F first
#define S second
#define SZ(x) ((int)(x).size())
#define ALL(x) x.begin(), x.end()

using namespace std;
using ll = long long;
using vi = vector<int>;
using vl = vector<ll>;
using vvi = vector<vi>;
using vvl = vector<vl>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vii = vector<pii>;
using vll = vector<pll>;

const ll inf = 0x3f3f3f3f3f3f3f3f;
void sol() {
    int n, m, src, dest, U, V;
    cin >> n >> m >> src >> dest >> U >> V;
    --src, --dest, --U, --V;

    vector<vii> adj(n);
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[--u].push_back({--v, w});
        adj[v].push_back({u, w});
    }

    auto dijkstra = [n, m, &adj](int src) -> pair<vl, vvi> {
        vl dis(n, inf);
        vvi from(n);
        dis[src] = 0;
        using T = pair<ll, int>;
        priority_queue<T, vector<T>, greater<>> pq;
        pq.push({0, src});
        while (SZ(pq)) {
            auto [w, u] = pq.top();
            pq.pop();
            if (w > dis[u]) continue;
            for (auto [v, w2]: adj[u]) {
                if (dis[v] > w + w2) {
                    dis[v] = w + w2;
                    from[v] = {u};
                    pq.push({dis[v], v});
                } else if (dis[v] == w + w2) {
                    from[v].push_back(u);
                }
            }
        }
        return {dis, from};
    };

    auto [dis_src, from] = dijkstra(src);
    vl dis_u = dijkstra(U).F;
    vl dis_v = dijkstra(V).F;

    vi deg(n, 0);
    vi vec;
    vector<bool>vis(n);
    function<void(int)> dfs = [&](int u) -> void {
        vis[u] = 1;
        vec.push_back(u);
        for (int v: from[u]) if (!vis[v]) dfs(v);
    };
    dfs(dest);
    for (int u: vec) for (int v: from[u]) deg[v]++;
    vl mn_u(n, inf), mn_v(n, inf);
    queue<int> qq({dest});
    ll ans = dis_u[V];
    while (SZ(qq)) {
        int u = qq.front();
        qq.pop();
        mn_u[u] = min(mn_u[u], dis_u[u]);
        mn_v[u] = min(mn_v[u], dis_v[u]);
        ans = min(ans, mn_u[u] + dis_v[u]);
        ans = min(ans, mn_v[u] + dis_u[u]);
        // cerr << u << '\n';
        // cerr << mn_u[u] << ' ' << dis_v[u] << '\n';
        // cerr << mn_v[u] << ' ' << dis_u[u] << '\n';
        for (int v: from[u]) {
            mn_u[v] = min(mn_u[v], mn_u[u]);
            mn_v[v] = min(mn_v[v], mn_v[u]);
            if (--deg[v] == 0) {
                qq.push(v);
            }
        }
    }
    cout << ans << '\n';
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    sol();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...