Submission #1273761

#TimeUsernameProblemLanguageResultExecution timeMemory
1273761quanw267Commuter Pass (JOI18_commuter_pass)C++17
100 / 100
186 ms23136 KiB
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair<long long,long long>
#define fast ios_base::sync_with_stdio(0), cin.tie(0);

using namespace std;

const ll N = 1e5+5;
const ll INF = 1e15;

ll n,m,A,B,C,D,ans;
ll d[N][3],dp[N][3];
bool vis[N];
vector<pii> g[N];

void path(ll u, ll type){
    priority_queue<pii,vector<pii>,greater<pii>> q;
    d[u][type] = 0;
    q.push({0,u});
    while(!q.empty()){
        auto [kc, u] = q.top(); q.pop();
        if(kc > d[u][type]) continue;
        for(auto [v,w] : g[u]){
            if(d[v][type] > d[u][type] + w){
                d[v][type] = d[u][type] + w;
                q.push({d[v][type], v});
            }
        }
    }
}

void trace(ll u){
    dp[u][1] = d[u][1];
    dp[u][2] = d[u][2];
    vis[u] = 1;
    for(auto [v,w] : g[u]){
        if(d[v][0] == d[u][0] - w){
            if(!vis[v]) trace(v);
            dp[u][1] = min(dp[u][1], dp[v][1]);
            dp[u][2] = min(dp[u][2], dp[v][2]);
        }
    }
    ans = min({ans, dp[u][1] + d[u][2], dp[u][2] + d[u][1]});
}

int main(){
    fast
    cin >> n >> m >> A >> B >> C >> D;
    for(ll i=1; i<=m; i++){
        ll u,v,w; cin >> u >> v >> w;
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    for(ll i=1; i<=n; i++)
        for(int t=0; t<3; t++)
            d[i][t] = INF;

    path(A,0);
    path(C,1);
    path(D,2);

    ans = d[D][1];
    trace(B);

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