제출 #851707

#제출 시각아이디문제언어결과실행 시간메모리
851707dwuyCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
277 ms31504 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
typedef pair<int, int> pii;

const long long OO = 1e18;
const int INF = 1e9;
const int MX = 200005;

int n, m, S, T, U, V;
vector<pii> G[MX];

void nhap(){
    cin >> n >> m;
    cin >> S >> T;
    cin >> U >> V;
    for(int i=1; i<=m; i++){
        int u, v, c;
        cin >> u >> v >> c;
        G[u].push_back({v, c});
        G[v].push_back({u, c});
    }
}

void dijkstra(int source, vector<int> &d){
    d[source] = 0;
    priority_queue<pair<int, int>> Q;
    Q.push({0, source});
    while(Q.size()){
        int du, u;
        tie(du, u) = Q.top();
        du = -du;
        Q.pop();
        if(du!=d[u]) continue;
        for(pii &tmp: G[u]){
            int v, c;
            tie(v, c) = tmp;
            if(d[v]>du+c){
                d[v] = du + c;
                Q.push({-d[v], v});
            }
        }
    }
}

void sub1(){
    vector<int> dS(n+5, OO);
    vector<int> dT(n+5, OO);
    vector<int> dV(n+5, OO);
    dijkstra(S, dS);
    dijkstra(T, dT);
    dijkstra(V, dV);
    int ans = dS[V];
    for(int i=1; i<=n; i++){
        if(dS[i] + dT[i] == dS[T]){
            ans = min(ans, dV[i]);
        }
    }
    cout << ans;
}

vector<int> rG[MX];
void sub3(){
    vector<int> dS(n+5, OO);
    vector<int> dT(n+5, OO);
    vector<int> dU(n+5, OO);
    vector<int> dV(n+5, OO);
    /// thieu S
    dijkstra(T, dT);
    dijkstra(U, dU);
    dijkstra(V, dV);

    dS[S] = 0;
    priority_queue<pair<int, int>> Q;
    Q.push({0, S});
    while(Q.size()){
        int du, u;
        tie(du, u) = Q.top();
        du = -du;
        Q.pop();
        if(du!=dS[u]) continue;
        for(pii &tmp: G[u]){
            int v, c;
            tie(v, c) = tmp;
            if(dS[v]>du+c){
                dS[v] = du + c;
                Q.push({-dS[v], v});
                rG[v].clear();
                rG[v].push_back(u);
            }
            else if(dS[v]==du+c) rG[v].push_back(u);
        }
    }

    int ans = dU[V];

    vector<int> d(n+5, OO);
    d[T] = dU[T];
    Q.push({-d[T], T});
    while(Q.size()){
        int du, u;
        tie(du, u) = Q.top();
        du = -du;
        Q.pop();
        if(du!=d[u]) continue;
        ans = min(ans, du + dV[u]);
        for(int v: rG[u]){
            if(d[v]>min(du, dU[v])){
                d[v] = min(du, dU[v]);
                Q.push({-d[v], v});
            }
        }
    }

    d = vector<int>(n+5, OO);
    d[T] = dV[T];
    Q.push({-d[T], T});
    while(Q.size()){
        int du, u;
        tie(du, u) = Q.top();
        du = -du;
        Q.pop();
        if(du!=d[u]) continue;
        ans = min(ans, du + dU[u]);
        for(int v: rG[u]){
            if(d[v]>min(du, dV[v])){
                d[v] = min(du, dV[v]);
                Q.push({-d[v], v});
            }
        }
    }
    cout << ans;
}

void solve(){
    if(S==U){
        sub1();
        return;
    }
    sub3();
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    nhap();
    solve();

    return 0;
}
/**

11 12
1 8
11 2
1 2 9
1 4 8
2 3 7
3 10 3
3 11 3
4 5 5
4 6 1
4 10 5
5 7 1
7 11 0
7 8 5
7 9 8


**/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...