Submission #1308188

#TimeUsernameProblemLanguageResultExecution timeMemory
1308188vaishakhvCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
460 ms34516 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll cap = 2e5+1;

vector<pair<ll,ll>> adj[cap];
vector<ll> dag[cap];
ll indegree[cap];

ll distS[cap];
ll distU[cap];
ll distV[cap];

vector<tuple<ll,ll,ll>> edges;
priority_queue<pair<ll,ll>> pqs;
priority_queue<pair<ll,ll>> pqu;
priority_queue<pair<ll,ll>> pqv;

ll s, t, u, v;

void dijkstra(){
    pqs.push({0,s});
    while(!pqs.empty()){
        pair<ll,ll> info = pqs.top(); pqs.pop();
        ll d = -1*info.first, n = info.second;
        if (d != distS[n]) continue;
        for (auto nxt: adj[n]){
            if (distS[n] + nxt.second < distS[nxt.first]){
                distS[nxt.first] = distS[n] + nxt.second;
                pqs.push({-distS[nxt.first], nxt.first});
            }
        }
    }

    pqu.push({0,u});
    while(!pqu.empty()){
        pair<ll,ll> info = pqu.top(); pqu.pop();
        ll d = -1*info.first, n = info.second;
        if (d != distU[n]) continue;
        for (auto nxt: adj[n]){
            if (distU[n] + nxt.second < distU[nxt.first]){
                distU[nxt.first] = distU[n] + nxt.second;
                pqu.push({-distU[nxt.first], nxt.first});
            }
        }
    }

    pqv.push({0,v});
    while(!pqv.empty()){
        pair<ll,ll> info = pqv.top(); pqv.pop();
        ll d = -1*info.first, n = info.second;
        if (d != distV[n]) continue;
        for (auto nxt: adj[n]){
            if (distV[n] + nxt.second < distV[nxt.first]){
                distV[nxt.first] = distV[n] + nxt.second;
                pqv.push({-distV[nxt.first], nxt.first});
            }
        }
    }
}


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

    ll n, m; cin >> n >> m;
    cin >> s >> t >> u >> v;

    for (ll i{}; i < m; i++){
        ll a, b, w; cin >> a >> b >> w;
        adj[a].push_back({b,w});
        adj[b].push_back({a,w});
        edges.push_back({a,b,w});
    }
    
    fill(distS, distS+cap, 1e18);
    fill(distU, distU+cap, 1e18);
    fill(distV, distV+cap, 1e18);
    fill(indegree, indegree+cap, 0);

    distS[s] = 0; distU[u] = 0; distV[v] = 0;
    dijkstra();

    for (auto edge: edges){
        ll a, b, w; tie(a,b,w) = edge;
        if (distS[a] + w == distS[b]){
            indegree[b]++; 
            dag[a].push_back(b); 
        }
        if (distS[b] + w == distS[a]){
            indegree[a]++;
            dag[b].push_back(a);
        }
    }

    queue<ll> q;
    vector<ll> sorted;

    for (ll i = 1; i <= n; i++){
        if (indegree[i] == 0 && distS[i] != 1e18) q.push(i);
    }

    while(!q.empty()){
        ll fr = q.front(); q.pop();
        sorted.push_back(fr);
        for (auto nxt: dag[fr]){
            indegree[nxt]--;
            if (indegree[nxt] == 0) q.push(nxt);
        }
    }

    vector<ll> dp_entry(n+1, 1e18);
    vector<ll> dp_answer(n+1, 1e18);

    for (auto n: sorted){
        dp_entry[n] = min(distU[n], dp_entry[n]);
        dp_answer[n] = min(dp_answer[n], dp_entry[n] + distV[n]);
        for (auto nxt: dag[n]){
            dp_entry[nxt] = min(dp_entry[nxt], dp_entry[n]);
            dp_answer[nxt] = min(dp_answer[nxt], dp_answer[n]);
        }
    }

    cout << min(distU[v], dp_answer[t]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...