Submission #1218976

#TimeUsernameProblemLanguageResultExecution timeMemory
1218976niwradCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
186 ms30120 KiB
#include <bits/stdc++.h>
using namespace std;

long long inf = 1e17;
int n;

vector<vector<pair<int, long long>>> graph;

vector<long long> dijkstra(int s) {
    vector<long long> dis(n, inf);
    vector<int> vis(n);
    dis[s] = 0;
    priority_queue<pair<long long, int>> pq;
    pq.push({0, s});
    while (pq.size() > 0) {
        auto t = pq.top();
        pq.pop();
        if (vis[t.second]) {
            continue;
        }
        vis[t.second] = 1;
        for (auto adj : graph[t.second]) {
            if (adj.second + dis[t.second] < dis[adj.first]) {
                dis[adj.first] = adj.second + dis[t.second];
                pq.push({-dis[adj.first], adj.first});
            }
        }
    }
    return dis;
}



int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    s--; t--; u--; v--;
    graph.resize(n);
    for (int i = 0; i < m; i++) {
        int a, b; long long c;
        cin >> a >> b >> c;
        graph[--a].push_back({--b, c});
        graph[b].push_back({a, c});
    }
    vector<long long> u_dis = dijkstra(u);
    vector<long long> u_par = u_dis;
    vector<long long> u_child = u_dis;
    vector<long long> v_dis = dijkstra(v);
    vector<long long> dis(n, inf);
    vector<vector<int>> par(n);
    vector<int> vis(n);
    dis[s] = 0;
    priority_queue<pair<long long, int>> pq;
    pq.push({0, s});
    while (pq.size() > 0) {
        auto t = pq.top();
        pq.pop();
        if (vis[t.second]) {
            continue;
        }
        vis[t.second] = 1;
        for (auto adj : graph[t.second]) {
            if (adj.second + dis[t.second] < dis[adj.first]) {
                dis[adj.first] = adj.second + dis[t.second];
                par[adj.first].clear();
                par[adj.first].push_back(t.second);
                pq.push({-dis[adj.first], adj.first});
            } else if (adj.second + dis[t.second] == dis[adj.first]) {
                par[adj.first].push_back(t.second);
            }
        }
    }
    vector<int> on(n);
    queue<int> q;
    on[t] = 1;
    q.push(t);
    while (q.size() > 0) {
        int f = q.front();
        q.pop();
        for (auto adj : par[f]) {
            if (!on[adj]) {
                on[adj] = 1;
                q.push(adj);
            }
        }
    }
    vector<vector<int>> child(n);
    for (int i = 0; i < n; i++) {
        if (on[i]) {
            for (int j = 0; j < par[i].size(); j++) {
                child[par[i][j]].push_back(i);
            }
            pq.push({-u_dis[i], i});
        }
    }
    while (pq.size() > 0) {
        auto t = pq.top();
        pq.pop();
        long long d = -t.first;
        if (u_par[t.second] >= d) {
            queue<int> q;
            q.push(t.second);
            while (q.size() > 0) {
                for (auto adj : par[q.front()]) {
                    if (u_par[adj] > d && on[adj]) {
                        u_par[adj] = d;
                        q.push(adj);
                    }
                }
                q.pop();
            }
        }
        if (u_child[t.second] >= d) {
            queue<int> q;
            q.push(t.second);
            while (q.size() > 0) {
                for (auto adj : child[q.front()]) {
                    if (u_child[adj] > d && on[adj]) {
                        u_child[adj] = d;
                        q.push(adj);
                    }
                }
                q.pop();
            }
        }
    }
    long long out = inf;
    for (int i = 0; i < n; i++) {
        long long m_u = min(u_child[i], u_par[i]);
        out = min(out, m_u + v_dis[i]);
    }
    cout << out << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...