제출 #1325619

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

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

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});
            }
        }
    }
}

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

    vector<vector<int>> dag(N + 1);
    vector<int> in_deg(N + 1, 0);
    for (int u = 1; u <= N; u++) {
        for (auto &e : adj[u]) {
            int v = e.to;
            ll w = e.cost;
            if (distS[u] + w + distT[v] == distS[T]) {
                dag[u].push_back(v);
                in_deg[v]++;
            }
        }
    }

    vector<ll> dpU = distU;
    vector<ll> dpV = distV;
    queue<int> q;
    for (int i = 1; i <= N; i++) if (in_deg[i] == 0) q.push(i);

    ll ans = distU[V];

    while (!q.empty()) {
        int u = q.front(); q.pop();
        ans = min(ans, dpU[u] + distV[u]);
        ans = min(ans, dpV[u] + distU[u]);
        for (int v : dag[u]) {
            dpU[v] = min(dpU[v], dpU[u]);
            dpV[v] = min(dpV[v], dpV[u]);
            if (--in_deg[v] == 0) q.push(v);
        }
    }

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