제출 #1325617

#제출 시각아이디문제언어결과실행 시간메모리
1325617kenkunkinCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
180 ms27108 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll INF = 1e15;

struct Edge {
    int to;
    ll cost;
};

int N, M, S, T, U, V;
vector<vector<Edge>> adj;

void Init() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

void Input() {
    cin >> N >> M;
    cin >> S >> T >> U >> V;
    adj.assign(N + 1, vector<Edge>());
    for (int i = 0; i < M; i++) {
        int a, b; ll c;
        cin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
}

void Dijkstra(int start, vector<ll>& dist) {
    dist.assign(N + 1, INF);
    dist[start] = 0;
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if (d > dist[u]) continue;
        for (auto &e : adj[u]) {
            int v = e.to; ll w = e.cost;
            if (dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
}

vector<vector<Edge>> dag;
vector<bool> check;

void DFS(int u, const vector<ll>& distS) {
    check[u] = true;
    for (auto &e : adj[u]) {
        int v = e.to; ll w = e.cost;
        if (distS[v] == distS[u] + w) {
            dag[u].push_back({v, w});
            if (!check[v]) DFS(v, distS);
        }
    }
}

void Solve() {
    vector<ll> distS, distU, distV;
    Dijkstra(S, distS);
    Dijkstra(U, distU);
    Dijkstra(V, distV);

    dag.assign(N + 1, vector<Edge>());
    check.assign(N + 1, false);
    DFS(S, distS);

    vector<int> order(N);
    iota(order.begin(), order.end(), 1);
    sort(order.begin(), order.end(), [&](int a,int b){ return distS[a] < distS[b]; });

    vector<ll> bx(N + 1, INF), by(N + 1, INF);
    ll ans = INF;

    for (int u : order) {
        bx[u] = min(bx[u], distU[u]);
        by[u] = min(by[u], distV[u]);
        for (auto &e : dag[u]) {
            int v = e.to;
            bx[v] = min(bx[v], bx[u]);
            by[v] = min(by[v], by[u]);
        }
    }

    for (int u = 1; u <= N; u++) {
        ans = min(ans, min(bx[u] + distV[u], by[u] + distU[u]));
    }

    cout << ans << "\n";
}

int main() {
    Init();
    Input();
    Solve();
    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...