제출 #701638

#제출 시각아이디문제언어결과실행 시간메모리
701638phiCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
1232 ms262144 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <tuple>
#include <cmath>

using namespace std;

vector<long long> min_dist(vector<vector<pair<int, long long>>> &adj, int source, int n) {
    vector<long long> depth(n, -1);

    using T = pair<long long, int>;
    priority_queue<T, vector<T>, greater<T>> q;
    q.push({ 0, source });

    while (!q.empty()) {
        auto [ d, v ] = q.top();
        q.pop();

        if (depth[v] != -1) continue;
        depth[v] = d;

        for (auto [ u, w ] : adj[v]) {
            q.push({ d + w, u });
        }
    }

    return depth;
}

struct Path {
    long long cost;
    long long u_dist;
    long long v_dist;

    friend bool operator>(const Path &l, const Path &r) {
        if (l.cost == r.cost) {
            return (l.u_dist > r.u_dist) && (l.v_dist > r.v_dist);
        }
        return l.cost > r.cost;
    }

    friend bool operator<(const Path &l, const Path &r) {
        return r > l;
    }
};

int main() {
    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    s--; t--; u--; v--;

    vector<vector<pair<int, long long>>> adj(n);

    for (int i = 0; i < m; i++) {
        int a, b;
        long long c;
        cin >> a >> b >> c;

        a--; b--;
        adj[a].push_back({ b, c });
        adj[b].push_back({ a, c });
    }

    vector<long long> min_u = min_dist(adj, u, n);
    vector<long long> min_v = min_dist(adj, v, n);

    vector<Path> ans(n);
    vector<long long> dist(n);
    vector<bool> visited(n);

    using T = pair<Path, int>;
    priority_queue<T, vector<T>, greater<T>> q;
    q.push({ { 0, min_u[s], min_v[s] }, s });

    while (!q.empty()) {
        auto [ path, r ] = q.top();
        q.pop();

        if (!visited[r]) {
            visited[r] = true;
            ans[r] = path;
            dist[r] = path.u_dist + path.v_dist;
        }

        if (ans[r] < path) continue;

        dist[r] = min(dist[r], path.u_dist + path.v_dist);

        for (auto [ p, w ] : adj[r]) {
            q.push({ { path.cost + w, min(path.u_dist, min_u[p]), min(path.v_dist, min_v[p]) }, p });
        }
    }

    cout << (ans[t].u_dist + ans[t].v_dist);

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