제출 #1282946

#제출 시각아이디문제언어결과실행 시간메모리
1282946smileyboiCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
183 ms16108 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using vi = vector<int>;
using vl = vector<ll>;
using pii = pair<int,int>;
using pil = pair<int,ll>;
using pli = pair<ll,int>;
using pll = pair<ll,ll>;

#define __SmileyBoi__ int main()
#define __CodeKhongBug__ ios_base::sync_with_stdio(0);cin.tie(0);
#define all(v) v.begin(),v.end()
#define eb emplace_back

const int MAXN = 1e5 + 5;
const ll INF = 2e18;

int n,m;

vector<pii> e[MAXN];
ll du[MAXN],dv[MAXN],ans = INF;

void dijkstra(int s,ll d[]){
    fill(d + 1,d + n + 1,INF);
    d[s] = 0;
    priority_queue<pli,vector<pli>,greater<>> pq;
    pq.emplace(d[s],s);
    while(pq.size()){
        pli p = pq.top();pq.pop();
        ll dist = p.first;
        int u = p.second;
        if(dist != d[u]) continue;
        for(pii t : e[u]){
            int v = t.first,w = t.second;
            if(d[v] > d[u] + w){
                d[v] = d[u] + w;
                pq.emplace(d[v],v);
            }
        }
    }
}

ll d[MAXN],best_du[MAXN],best_dv[MAXN];

void calc(int S,int T){
    fill(d + 1,d + n + 1,INF);
    fill(best_du + 1,best_du + n + 1,INF);
    fill(best_dv + 1,best_dv + n + 1,INF);
    d[S] = 0;
    best_du[S] = du[S];
    best_dv[S] = dv[S];
    priority_queue<pli,vector<pli>,greater<>> pq;
    pq.emplace(d[S],S);
    while(pq.size()){
        pli p = pq.top();pq.pop();
        ll dist = p.first;
        int u = p.second;
        if(dist != d[u]) continue;
        for(pii t : e[u]){
            int v = t.first,w = t.second;
            if(d[v] > d[u] + w){
                d[v] = d[u] + w;
                best_du[v] = min(best_du[u],du[v]);
                best_dv[v] = min(best_dv[u],dv[v]);
                pq.emplace(d[v],v);
            }
            else if(d[v] == d[u] + w){
                if(min(best_du[u],du[v]) + min(best_dv[u],dv[v]) < best_du[v] + best_dv[v]){
                    best_du[v] = min(best_du[u],du[v]);
                    best_dv[v] = min(best_dv[u],dv[v]);
                    pq.emplace(d[v],v);
                }
            }
        }
    }
    ans = min(ans,best_du[T] + best_dv[T]);
}

__SmileyBoi__{
    __CodeKhongBug__

    int S,T,U,V;
    cin >> n >> m >> S >> T >> U >> V;
    for(int i = 1;i <= m;i++){
        int u,v,w;
        cin >> u >> v >> w;
        e[u].eb(v,w);
        e[v].eb(u,w);
    }
    dijkstra(U,du);
    dijkstra(V,dv);
    ans = du[V];
    calc(S,T);
    calc(T,S);
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...