제출 #1332454

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

using ll = long long;
const ll inf = (1LL << 62);
#define MAXN 1000005

ll ans;
vector <pair<ll,ll>> E[MAXN];
vector <ll> ds, dt, du, dv, BU,BV, G1[MAXN], G2[MAXN];
bool cmp1(int x,int y) {
    return ds[x] < ds[y];
}
void dijkstra(int x, vector <ll>& D) {
    priority_queue <pair<ll,int>> q;
    q.push({0, x});
    while(!q.empty()) {
        auto [c, d] =  q.top();
        q.pop();
        for(auto [i, ct] : E[d]) {
            if(D[i] <= D[d] + ct) continue;
            D[i] = D[d] + ct;
            q.push({-D[i], i});
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;
    int S, T, U, V;
    cin >> S >> T;
    cin >> U >> V;
    ds.assign(N + 1, inf);
    dt.assign(N + 1, inf);
    du.assign(N + 1, inf);
    dv.assign(N + 1, inf);
    for(int i = 1; i <= M; i++) {
        int u, v, t;
        cin >> u >> v >> t;
        E[u].push_back({v, t});
        E[v].push_back({u, t});
    }
    
    ds[S] = dt[T] = du[U] = dv[V] = 0;
    
    dijkstra(S, ds);
    dijkstra(T, dt);
    dijkstra(U, du);
    dijkstra(V, dv);
    
    for(int i = 1; i <= N; i++) {
        for(auto [nd, ct] : E[i]) {
            if(ds[i] + ct + dt[nd] == ds[T]) G1[i].push_back(nd);
            if(dt[i] + ct + ds[nd] == ds[T]) G2[i].push_back(nd);
        }
    }
    ans = dv[U];
    vector <int> ord(N);
    BU.assign(N + 1, 0);
    BV.assign(N + 1, 0);
    iota(ord.begin(), ord.end(), 1);
    sort(ord.begin(), ord.end(), cmp1);

    for(int i = 1; i <= N; i++) {
        BU[i] = du[i];
        BV[i] = dv[i];
    }
    for(int i = 0; i < N; i++) {
        int inx = ord[i];
        for(auto to : G1[inx]) {
            BU[to] = min(BU[inx], BU[to]);
            BV[to] = min(BV[inx], BV[to]);
        }
        ans = min(ans, BU[inx] + dv[inx]);
        ans = min(ans, BV[inx] + du[inx]);
    }

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