Submission #1331339

#TimeUsernameProblemLanguageResultExecution timeMemory
1331339Braabebo10Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
388 ms61532 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define ll long long
#define nl "\n"
#define all(v) v.begin(),v.end()
#define baraa ios_base::sync_with_stdio(false);cin.tie(NULL);
using namespace std;

int main() {
    baraa
    ll n, m, s, t, x, y;
    cin >> n >> m >> s >> t >> x >> y;
    vector<array<ll, 3> > edges(2 * m), adj[n + 1];
    vector<ll> good(2 * m), dir(2 * m);
    for (ll i = 0, u, v, c; i < 2 * m; i += 2) {
        cin >> u >> v >> c;
        edges[i] = {u, v, c};
        edges[i + 1] = {v, u, c};
        adj[u].push_back({v, c, i});
        adj[v].push_back({u, c, i + 1});
    }
    auto dijk = [&](ll st) {
        vector<ll> d(n + 1, 1e16);
        priority_queue<array<ll, 2>, vector<array<ll, 2> >, greater<> > pq;
        pq.push({d[st] = 0, st});
        while (pq.size()) {
            auto [c, u] = pq.top();
            pq.pop();
            if (c > d[u])continue;
            for (auto [v, w, idx]: adj[u])
                if (c + w < d[v])
                    pq.push({d[v] = c + w, v});
        }
        return d;
    };
    auto dS = dijk(s), dT = dijk(t);
    for (ll i = 0; i < 2 * m; i++) {
        auto [u, v, c] = edges[i];
        good[i] = (dS[u] + c + dT[v] == dS[t] or (dT[u] + c + dS[v] == dS[t]));
        if ((dS[u] + c + dT[v] == dS[t]))dir[i] = 1;
        else if ((dT[u] + c + dS[v] == dS[t]))dir[i] = 2;
        // cout << u << ' ' << v << ' ' << dS[u] + c + dT[v] << nl;
        // if (good[i])
        //     cout << "good: " << u << ' ' << v << ' ' << c << ' ' << (i & 1) << nl;
    }
    vector d(n + 1, vector(3, vector<ll>(3, 1e16)));
    priority_queue<array<ll, 4>, vector<array<ll, 4> >, greater<> > pq;
    pq.push({d[x][0][0] = 0, 0, 0, x});
    ll res = 1e16;
    while (pq.size()) {
        auto [cost, state1, state2, u] = pq.top();
        pq.pop();
        if (cost > d[u][state1][state2])continue;
        if (u == y)res = min(res, cost);
        // cout << u << ' ' << state1 << ' ' << state2 << ' ' << cost << nl;
        for (auto [v, w, idx]: adj[u]) {
            if (state1 == 0) {
                if (cost + w < d[v][0][0])
                    pq.push({d[v][0][0] = cost + w, 0, 0, v});
                if (good[idx] and cost < d[v][1][dir[idx]])
                    pq.push({d[v][1][dir[idx]] = cost, 1, dir[idx], v});
            } else if (state1 == 1) {
                if (cost < d[v][1][dir[idx]] and good[idx] and dir[idx] == state2)
                    pq.push({d[v][1][dir[idx]] = cost, 1, dir[idx], v});
            }
            if (cost + w < d[v][2][0])
                pq.push({d[v][2][0] = cost + w, 2, 0, v});
        }
    }
    cout << res;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...