제출 #1306265

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

using ll = long long;
const ll INF = 4e18;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, m;
    cin >> n >> m;
    int s, t;
    cin >> s >> t;
    int u, v;
    cin >> u >> v;
    s--; t--; u--; v--;  // 0-indexed
    
    vector<vector<tuple<int,int,ll>>> g(n);
    for (int i = 0; i < m; i++) {
        int a, b; ll c;
        cin >> a >> b >> c;
        a--; b--;
        g[a].emplace_back(b, i, c);
        g[b].emplace_back(a, i, c);
    }
    
    auto dijkstra = [&](int start) -> vector<ll> {
        vector<ll> dist(n, INF);
        dist[start] = 0;
        priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<>> pq;
        pq.emplace(0, start);
        while (!pq.empty()) {
            auto [d, x] = pq.top(); pq.pop();
            if (d > dist[x]) continue;
            for (auto [y, _, c] : g[x]) {
                if (dist[y] > dist[x] + c) {
                    dist[y] = dist[x] + c;
                    pq.emplace(dist[y], y);
                }
            }
        }
        return dist;
    };
    
    auto ds = dijkstra(s);
    auto dt = dijkstra(t);
    auto du = dijkstra(u);
    auto dv = dijkstra(v);
    
    ll dist_st = ds[t];
    ll ans = du[v];
    
    // Перебор всех рёбер как кандидатов на покрытие
    for (int x = 0; x < n; x++) {
        for (auto [y, _, c] : g[x]) {
            // Проверяем, лежит ли ребро (x,y) на КОП s-t
            if (ds[x] + c + dt[y] == dist_st || ds[y] + c + dt[x] == dist_st) {
                ll cost = du[x] + c + dv[y];
                if (cost < ans) ans = cost;
                ll cost2 = du[y] + c + dv[x];
                if (cost2 < ans) ans = cost2;
            }
        }
    }
    
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...