Submission #1308456

#TimeUsernameProblemLanguageResultExecution timeMemory
1308456pobeCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
529 ms30720 KiB
#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
#define int long long
vector <int> get(int start, vector <vector <pair <int, int>>> & gr) {
    set <pair <int, int>> cur;
    int n = gr.size();
    vector <int> dist(n, 2e18);
    dist[start] = 0;
    cur.insert({0, start});
    while (!cur.empty()) {
        int d, num;
        tie(d, num) = *cur.begin();
        cur.erase(cur.begin());
        for (auto &[next, w] : gr[num]) {
            if (dist[next] > d + w) {
                cur.erase({dist[next], next});
                dist[next] = d + w;
                cur.emplace(dist[next], next);
            }
        }
    }
    return dist;
}
vector <int> dists, distt, distv, distu;
int ans = 2e18;
void dfs(int num, int d, vector <vector <pair <int, int>>> &gr, vector <int> &vis, vector <int> &mx1, vector <int>& mx2) {
    vis[num] = 1;
    mx1[num] = distu[num];
    mx2[num] = distv[num];
    for (auto &[next, w] : gr[num]) {
        if (!vis[next]) {
            if (d == w + dists[num] + distt[next]) {
                dfs(next, d, gr, vis, mx1, mx2);
                mx1[num] = min(mx1[num], mx1[next]);
                mx2[num] = min(mx2[num], mx2[next]);
            }
        } else {
            if (d == w + dists[num] + distt[next]) {
                mx1[num] = min(mx1[num], mx1[next]);
                mx2[num] = min(mx2[num], mx2[next]);
            }
        }
    }
    ans = min(ans, mx1[num] + distv[num]);
    ans = min(ans, mx2[num] + distu[num]);
}
ostream & operator << (ostream &out, vector <int> val) {
    for (auto v : val) {
        out << v << ' ';
    }
    return out;
}
void solve() {
    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    --s;
    --t;
    --u;
    --v;
    vector <vector <pair <int, int>>> gr(n);
    for (int i = 0; i < m; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        --a;
        --b;
        gr[a].emplace_back(b, c);
        gr[b].emplace_back(a, c);
    }
    dists = get(s, gr);
    distt = get(t, gr);
    distu = get(u, gr);
    distv = get(v, gr);
//    cout << distu << '\n' << distv << '\n';
    vector <int> vis(n, 0);
    vector <int> mx1(n, 2e18), mx2(n, 2e18);
    dfs(s, dists[t], gr, vis, mx1, mx2);
    cout << min(ans, distu[v]) << '\n';
}
signed main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    int t = 1;
//    cin >> t;
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...