Submission #887547

#TimeUsernameProblemLanguageResultExecution timeMemory
887547Perl32Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
331 ms38600 KiB
// I wrote this code 4 u <3
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif

const ll INFL = (ll) 1e18 + 1e9;

signed main(int32_t argc, char *argv[]) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, s, t, su, sv;
    cin >> n >> m >> s >> t >> su >> sv;
    --s, --t, --su, --sv;
    vector<vector<pair<int, ll>>> g(n);
    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        --u, --v;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
    }
    function<vector<ll>(int)> dijkstra = [&](int from) {
        set<pair<ll, int>> st;
        vector<ll> dist(n, INFL);
        dist[from] = 0ll;
        st.insert({0ll, from});
        while (!st.empty()) {
            int u = st.begin()->second;
            st.erase(st.begin());
            for (auto [to, w] : g[u]) {
                if (dist[to] > dist[u] + w) {
                    st.erase({dist[to], to});
                    dist[to] = dist[u] + w;
                    st.insert({dist[to], to});
                }
            }
        }
        return dist;
    };
    vector<ll> distS = dijkstra(s);
    vector<bool> used(n, false), can(n, false);
    can[t] = true;
    vector<vector<int>> dag(n);
    function<void(int)> Dfs1 = [&](int u) {
        used[u] = true;
        for (auto [to, w] : g[u]) {
            if (distS[to] != distS[u] + w) continue;
            if (!used[to]) Dfs1(to);
            can[u] = can[u] || can[to];
            if (can[to]) {
                dag[u].emplace_back(to);
            }
        }
    };
    Dfs1(s);
    fill(used.begin(), used.end(), false);
    vector<ll> distV = dijkstra(sv), distU = dijkstra(su), closeV(n, INFL), closeU(n, INFL);;
    function<void(int)> Dfs2 = [&](int u) {
        used[u] = true;
        closeV[u] = distV[u];
        closeU[u] = distU[u];
        for (auto to : dag[u]) {
            if (!used[to]) Dfs2(to);
            closeV[u] = min(closeV[u], closeV[to]);
            closeU[u] = min(closeU[u], closeU[to]);
        }
    };
    Dfs2(s);
    ll ans = distU[sv];
    for (int i = 0; i < n; ++i) {
        ans = min({ans, closeV[i] + distU[i], closeU[i] + distV[i]});
    }
    cout << ans;
}

/*

 */

Compilation message (stderr)

commuter_pass.cpp: In lambda function:
commuter_pass.cpp:38:23: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   38 |             for (auto [to, w] : g[u]) {
      |                       ^
commuter_pass.cpp: In lambda function:
commuter_pass.cpp:54:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   54 |         for (auto [to, w] : g[u]) {
      |                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...