제출 #1274713

#제출 시각아이디문제언어결과실행 시간메모리
1274713kduckpCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
613 ms53284 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
const int N = 1e5 + 5;
vector<pair<int, ll>> adj[N];
int n, m, a, b, c, d;
vector<pair<int, int>> edges;
map<pair<int, int>, int> edge_id;
ll w[N * 2];
bool is_vip[N * 2];

vector<pair<int, int>> dag[N]; // shortest path DAG
ll distA[N];

void dijkstra(int src, ll* cost, ll* dist) {
    fill(dist, dist + n + 1, INF);
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
    dist[src] = 0;
    pq.push({0, src});
    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if (d > dist[u]) continue;
        for (auto [v, eid] : adj[u]) {
            ll c = cost[eid];
            if (dist[v] > dist[u] + c) {
                dist[v] = dist[u] + c;
                pq.push({dist[v], v});
            }
        }
    }
}

void build_shortest_path_dag(int a, int b) {
    // Build shortest path DAG from A to B
    for (int u = 1; u <= n; u++) {
        for (auto [v, eid] : adj[u]) {
            if (distA[u] + w[eid] == distA[v]) {
                dag[u].push_back({v, eid});
            }
        }
    }
}

void mark_vip_edges(int a, int b) {
    // Mark all edges in any shortest path from A to B as VIP using BFS/DFS
    vector<bool> visited(n + 1, false);
    queue<int> q;
    q.push(a);
    visited[a] = true;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (auto [v, eid] : dag[u]) {
            is_vip[eid] = true;
            if (!visited[v]) {
                visited[v] = true;
                q.push(v);
            }
        }
    }
}

vector<int> dijkstra_path(int src, int dst, ll* cost) {
    vector<ll> dist(n + 1, INF);
    vector<int> prev(n + 1, -1);
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
    dist[src] = 0;
    pq.push({0, src});
    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if (d > dist[u]) continue;
        for (auto [v, eid] : adj[u]) {
            ll c = cost[eid];
            if (dist[v] > dist[u] + c) {
                dist[v] = dist[u] + c;
                prev[v] = u;
                pq.push({dist[v], v});
            }
        }
    }
    vector<int> path;
    int cur = dst;
    while (cur != -1) {
        path.push_back(cur);
        cur = prev[cur];
    }
    reverse(path.begin(), path.end());
    return path;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m >> a >> b >> c >> d;
    for (int i = 1; i <= m; i++) {
        int u, v; ll ww;
        cin >> u >> v >> ww;
        adj[u].push_back({v, i});
        adj[v].push_back({u, i});
        edges.push_back({u, v});
        edge_id[{u, v}] = i;
        edge_id[{v, u}] = i;
        w[i] = ww;
    }
    ll cost1[N * 2];
    for (int i = 1; i <= m; i++) cost1[i] = w[i];
    dijkstra(a, cost1, distA);
    build_shortest_path_dag(a, b);
    mark_vip_edges(a, b);
    ll cost2[N * 2];
    for (int i = 1; i <= m; i++) cost2[i] = is_vip[i] ? 0 : w[i];
    ll distC[N];
    dijkstra(c, cost2, distC);
    cout << distC[d] << endl;
    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...