Submission #679915

#TimeUsernameProblemLanguageResultExecution timeMemory
679915Duy_eCommuter Pass (JOI18_commuter_pass)C++14
0 / 100
140 ms24820 KiB
#include <bits/stdc++.h>
#define ll long long
#define pii pair <ll, ll>
#define st first
#define nd second
#define rep(i, n, m) for (ll i = (n); i <= (m); i ++)
#define rrep(i, n, m) for (ll i = (n); i >= (m); i --)
using namespace std;
const long long INF = 1e18;
const long long N = 1e5 + 5;

int n, m, U, V, S, T;

void dijkstra(vector <pii> *adj, ll *dist, int s) {
    rep(i, 1, n) dist[i] = INF;
    priority_queue <pii, vector <pii>, greater <pii>> q;
    q.push({0, s});
    dist[s] = 0;
    while (q.size()) {
        ll w = q.top().st, u = q.top().nd; q.pop();
        if (w > dist[u]) return;

        for (pii x: adj[u]) {
            int v = x.st, cost = x.nd;
            ll newCost = w + cost;
            if (newCost < dist[v]) {
                dist[v] = newCost;
                q.push({dist[v], v});
            }
        }
    }
}

ll f[N], p[N];
vector <pii> d[N];

void initGraph() {
    rep(i, 1, m) {
        int u, v, w;
        cin >> u >> v >> w;
        d[u].push_back({v, w});
        d[v].push_back({u, w});
    }

    dijkstra(d, f, S);
    dijkstra(d, p, T);
}


namespace sub12 {
    vector <pii> g[N];
    ll ans[N];

    void solve() {
        ll mi = f[T];

        rep(i, 1, n) {
            g[i] = d[i];
            for (pii &x: g[i]) {
                ll w = x.nd, j = x.st;
                if (f[i] + w + p[j] == mi || f[j] + w + p[i] == mi)
                    x.nd = 0;
            }
        }

        dijkstra(g, ans, U);
        cout << ans[V] << '\n';
    }
}

namespace sub3 {

    ll fu[N], fv[N], mi, ans;
    bool vis[N];

    void dfs(int u1, int u) {
        vis[u] = true;
        ans = min(ans, min(fu[u1] + fv[u], fv[u1] + fu[u]));
        for (pii x: d[u])
            if (f[u] + x.nd + p[x.st] == mi && !vis[x.st])
                dfs(u1, x.st);
    }

    void solve() {
        mi = f[T];
        dijkstra(d, fu, U);
        dijkstra(d, fv, V);

        ans = fu[V];
        rep(i, 1, n) if (f[i] + p[i] == mi) {
            rep(j, 1, n) vis[j] = false;
            dfs(i, i);
        }

        cout << ans << '\n';
    }
}

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

    //freopen("test.inp", "r", stdin);
    //freopen("test.out", "w", stdout);

    cin >> n >> m >> S >> T >> U >> V;
    initGraph();
    //if (n <= 500 && m <= 500) sub3 :: solve(); else
    sub12 :: solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...