Submission #1358535

#TimeUsernameProblemLanguageResultExecution timeMemory
1358535waygonzCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
165 ms20112 KiB
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const ll inf = (ll)1e18;
const int N = (int)1e5 + 1;

int n, m;
ll dis[3][N], dp[2][N], ans = inf;
vector<pair<ll, int>> adj[N];

void sp(int st, int t) {
    priority_queue<pair<ll, int>> q;
    q.emplace(0, st);
    dis[t][st] = 0;
    while (!q.empty()) {
        auto [w, u] = q.top();
        q.pop();
        if (-w > dis[t][u]) continue;
        for (auto &[ww, v] : adj[u]) {
            if (-w + ww >= dis[t][v]) continue;
            dis[t][v] = -w + ww;
            q.emplace(w - ww, v);
        }
    }
}

ll solve(int st, int en) {
    for (int i = 1; i <= n; i++) dp[0][i] = dp[1][i] = inf, dis[2][i] = inf;
    priority_queue<pair<ll, int>> q;
    q.emplace(0, st);
    dp[0][st] = dis[0][st], dp[1][st] = dis[1][st], dis[2][st] = 0;
    while (!q.empty()) {
        auto [w, u] = q.top();
        q.pop();
        if (-w > dis[2][u]) continue;
        for (auto &[ww, v] : adj[u]) {
            if (-w + ww > dis[2][v]) continue;
            else if (-w + ww < dis[2][v]) q.emplace(w - ww, v);
            dp[0][v] = min(dp[0][v], min(dp[0][u], dis[0][u]));
            dp[1][v] = min(dp[1][v], min(dp[0][v] + dis[1][v], dp[1][u]));
            dis[2][v] = -w + ww;
        }
    }
    return dp[1][en];
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    while (m--) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].emplace_back(w, v);
        adj[v].emplace_back(w, u);
    }
    for (int i = 1; i <= n; i++) dis[0][i] = dis[1][i] = inf;
    sp(u, 0), sp(v, 1);
    cout << min(dis[0][v], min(solve(s, t), solve(t, s)));
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...