제출 #1332511

#제출 시각아이디문제언어결과실행 시간메모리
1332511tkhoi13Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
279 ms29440 KiB
#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = a, _b = (b); i <= _b; i++)
#define ROF(i, a, b) for (int i = a, _b = (b); i >= _b; i--)
#define REP(i, n) for (int i = 0, _n = (n); i < _n; i++)
#define szx(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pil pair<int, ll>
#define pli pair<ll, int>
#define mod 1000000007

using namespace std;

int n, m, s, t, u, v;
const int MAX = 1e5 + 5;
vector<pil> g[MAX];
const ll inf = 1e18;

void dijkstra(vector<ll>& dist, int s) {
    dist[s] = 0;
    priority_queue<pli, vector<pli>, greater<pli>> pq;
    pq.push({0, s});
    while (!pq.empty()) {
        int a = pq.top().se;
        ll d = pq.top().fi;
        pq.pop();
        if (d != dist[a]) continue;
        for (pii p : g[a]) {
            int b = p.fi;
            int w = p.se;
            if (d + w < dist[b]) {
                dist[b] = d + w;
                pq.push({d + w, b});
            }
        }
    }
}

void solve() {
    cin >> n >> m >> s >> t >> u >> v;
    FOR(i, 1, m) {
        int a, b, c;
        cin >> a >> b >> c;
        g[a].pb({b, c});
        g[b].pb({a, c});
    }

    vector<ll> distu(n + 1, inf), distv(n + 1, inf), dists(n + 1, inf);
    dijkstra(dists, s);
    dijkstra(distu, u);
    dijkstra(distv, v);

    ll SP = dists[t];

    vector<vector<int>> dag(n + 1), rdag(n + 1);
    vector<int> in(n + 1, -1);
    vector<bool> pushed(n + 1);
    vector<ll> distt(n + 1);

    queue<int> q;
    q.push(t);
    pushed[t] = 1;
    while (!q.empty()) {
        int a = q.front();
        in[a] = 0;
        q.pop();
        for (pii p : g[a]) {
            int b = p.fi;
            int w = p.se;

            if (dists[b] + w + distt[a] == SP) {
                rdag[a].pb(b);
                dag[b].pb(a);
                distt[b] = distt[a] + w;
                in[a]++;
                if (!pushed[b]) q.push(b), pushed[b] = 1;
            }
        }
    }

    FOR(i, 1, n) if (in[i] == 0) q.push(i);
    vector<int> topo{-1};

    while (!q.empty()) {
        int a = q.front();
        q.pop();
        topo.pb(a);
        for (int b : dag[a])
            if (--in[b] == 0) q.push(b);
    }

    ll ans = distu[v];
    vector<ll> minu(n + 1, inf), minv(n + 1, inf);

    FOR(i, 1, szx(topo) - 1) {
        int a = topo[i];
        ans = min(distu[a] + distv[a], ans);
        minu[a] = distu[a];
        minv[a] = distv[a];

        for (int b : rdag[a]) {
            minu[a] = min(minu[a], minu[b]);
            minv[a] = min(minv[a], minv[b]);
        }
        ans = min({ans, distv[a] + minu[a], distu[a] + minv[a]});
    }
    cout << ans;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    // freopen("main.in", "r", stdin);
    // freopen("main.out", "w", stdout);
    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...