Submission #1142247

#TimeUsernameProblemLanguageResultExecution timeMemory
1142247ray1457Commuter Pass (JOI18_commuter_pass)C++20
0 / 100
118 ms21720 KiB
#include <bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define ll long long
#define int ll

const int INF = 1e9;

void solve() {
    int n,m,s,t,u,v;
    cin >> n >> m
        >> s >> t
        >> u >> v;

    vector<pii> adj[n+1];
    for (int i = 0; i<m; i++) {
        int a,b,c;
        cin >> a >> b >> c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
    }

    set<int> path;
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    vector<bool> vis(n+1, false);
    vi d(n+1, INF);
    vi p(n+1, -1);
    d[s] = 0;

    pq.push({0, s});

    while (!pq.empty()) {
        int x = pq.top().ss;
        pq.pop();

        if (vis[x]) continue;
        vis[x] = true;

        for (auto ed : adj[x]) {
            int nd = ed.ff;
            int w = ed.ss;
            if (d[nd] > d[x] + w) {
                d[nd] = d[x] + w;
                pq.push({d[nd], nd});
                p[nd] = x;
            }
        }
    }

    for (int i = t; i != s; i = p[i]) path.insert(i);
    path.insert(s);

    vector<bool> rch_u(n+1, false);
    vis.assign(n+1, false);
    function<void(int)> dfs = [&] (int x) {
        if (vis[x]) return ;
        vis[x] = true;

        rch_u[x] = true;

        for (auto [nd, w] : adj[x]) {
            dfs(nd);
        }
    };

    dfs(u);


    vis.assign(n+1, false);
    d.assign(n+1, INF);

    d[v] = 0;
    queue<int> q;
    q.push(v);

    while (!q.empty()) {
        int x = q.front();
        q.pop();

        if (vis[x]) continue;
        vis[x] = true;

        for (auto [nd, w] : adj[x]) {
            d[nd] = min(d[nd], d[x] + w);
            q.push(nd);
        }
    }

    int ans = d[u];
    for (auto nd : path) {
        if (rch_u[nd]) {
            ans = min(ans, d[nd]);
        }
    }

    cout << ans << endl;



}


signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
    // cin >> t;
    while (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...