This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<pair<int, ll>>> adj;
vector<vector<int>> nadj;
vector<vector<int>> nradj;
int n, m, s, t, u, v;
int main () {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m >> s >> t >> u >> v;
    s--; t--; u--; v--;
    adj.resize(n);
    nadj.resize(n);
    nradj.resize(n);
    for (int i = 0; i < m; i++) {
        int a, b; ll c; cin >> a >> b >> c; a--; b--;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
    vector<ll> dist(n);
    vector<bool> vis(n);
    pq.push({0, t});
    while (!pq.empty()) {
        auto p = pq.top(); pq.pop();
        int node = p.second;
        ll len = p.first;
        if (vis[node]) continue;
        dist[node]=len;
        vis[node]=true;
        for (auto i : adj[node]) {
            if (!vis[i.first]) pq.push({len+i.second, i.first});
        }
    }
    fill(vis.begin(), vis.end(), false);
    queue<int> q;
    q.push(s);
    while (!q.empty()) {
        int node = q.front(); q.pop();
        if (vis[node]) continue;
        vis[node]=true;
        for (auto i : adj[node]) {
            if (vis[i.first]) continue;
            if (dist[i.first]+i.second==dist[node]) {
                nadj[node].push_back(i.first);
                nradj[i.first].push_back(node);
                q.push(i.first);
            } 
        }
    }
    vector<ll> udist(n), vdist(n);
    while (!pq.empty()) pq.pop();
    fill(vis.begin(), vis.end(), false);
    pq.push({0, u});
    while (!pq.empty()) {
        auto p = pq.top(); pq.pop();
        int node = p.second;
        ll len = p.first;
        if (vis[node]) continue;
        udist[node]=len;
        vis[node]=true;
        for (auto i : adj[node]) {
            if (!vis[i.first]) pq.push({len+i.second, i.first});
        }
    }
    while (!pq.empty()) pq.pop();
    fill(vis.begin(), vis.end(), false);
    pq.push({0, v});
    while (!pq.empty()) {
        auto p = pq.top(); pq.pop();
        int node = p.second;
        ll len = p.first;
        if (vis[node]) continue;
        vdist[node]=len;
        vis[node]=true;
        for (auto i : adj[node]) {
            if (!vis[i.first]) pq.push({len+i.second, i.first});
        }
    }
    vector<int> nchild(n);
    set<int> s;
    vector<ll> dp1(n);
    vector<ll> dp2(n);
    for (int i = 0; i < n; i++) {
        nchild[i] = nadj[i].size();
        if (nchild[i]==0) s.insert(i);
        dp1[i]=vdist[i];
        dp2[i]=udist[i];
    }
    ll ans = 1e18;
    while (!s.empty()) {
        auto node = *s.begin();
        s.erase(s.begin());
        for (auto child : nadj[node]) {
            dp1[node] = min(dp1[node], dp1[child]);
            dp2[node] = min(dp2[node], dp2[child]);
        }
        ans = min(ans, udist[node]+dp1[node]);
        ans = min(ans, vdist[node]+dp2[node]);
        for (auto parent : nradj[node]) {
            if (--nchild[parent]==0) {
                s.insert(parent);
            }
        }
    }
    cout << ans << "\n";
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |