Submission #1368259

#TimeUsernameProblemLanguageResultExecution timeMemory
1368259tranvinhhuy2010Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
186 ms25684 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int nmax = 1e5 + 5;
const ll inf = 1e16;
int n, m, S, T, U, V;
vector <pair <int, ll>> g[nmax];
ll ds[nmax], dt[nmax], du[nmax], dv[nmax], dpu[nmax], dpv[nmax];
vector <int> topo, dag[nmax];
bool dd[nmax];

void dijkstra(int start, ll d[]) {
    for (int i=1; i<=n; i++)
        d[i] = inf;
    d[start] = 0;

    priority_queue <pair <ll, int>, vector <pair <ll, int>>, greater<>> pq;
    pq.push({0, start});
    while (!pq.empty()) {
        auto [dist, u] = pq.top(); pq.pop();
        if (dist>d[u]) continue;

        for (auto [v, w] : g[u]) {
            if (dist+w<d[v]) {
                d[v] = dist + w;
                pq.push({d[v], v});
            }
        }
    }
}

void dfs(int u) {
    dd[u] = true;
    for (int v : dag[u])
        if (!dd[v]) dfs(v);
    topo.push_back(u);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m >> S >> T >> U >> V;
    while (m--) {
        int u, v; ll w;
        cin >> u >> v >> w;
        g[u].push_back({v, w});
        g[v].push_back({u, w});
    }

    dijkstra(S, ds);
    dijkstra(T, dt);
    dijkstra(U, du);
    dijkstra(V, dv);

    for (int u=1; u<=n; u++)
        for (auto [v, w] : g[u])
            if (ds[u] + w + dt[v]==ds[T]) dag[u].push_back(v);

    for (int i=1; i<=n; i++)
        if (!dd[i]) dfs(i);

    for (int i=1; i<=n; i++) {
        if (ds[i]+dt[i]!=ds[T]) dpu[i] = dpv[i] = inf;
        else {
            dpu[i] = du[i];
            dpv[i] = dv[i];
        }
    }

    reverse(topo.begin(), topo.end());
    ll ans = du[V];
    for (int u : topo) {
        ans = min(ans, dpu[u] + dv[u]);
        ans = min(ans, dpv[u] + du[u]);

        for (int v : dag[u]) {
            dpu[v] = min(dpu[v], dpu[u]);
            dpv[v] = min(dpv[v], dpv[u]);
        }
    }

    cout << ans;

    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...