제출 #478072

#제출 시각아이디문제언어결과실행 시간메모리
478072FireGhost1301Commuter Pass (JOI18_commuter_pass)C++11
100 / 100
352 ms28464 KiB
/**
    __author__: FireGhost
*/

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pli = pair<ll, int>;
#define fi first
#define se second

const int N = 1e5 + 3;
int n, m, S, T, U, V;
vector<pii> g[N];
ll dS[N], dT[N], dU[N], dV[N];
vector<int> prv[N], nxt[N];
bool vst[N];
ll dp[N], dp2[N];

void dijkstra(int s, ll* d) {
    priority_queue<pli, vector<pli>, greater<pli>> pq;
    d[s] = 0;
    pq.emplace(0, s);
    while (!pq.empty()) {
        auto x = pq.top(); pq.pop();
        int u = x.se; 
        ll dist = x.fi;
        if (dist != d[u]) continue;
        for (pair<int, int> e: g[u]) {
            int v = e.fi, w = e.se;
            if (d[v] > dist + w) {
                d[v] = dist + w;
                pq.emplace(d[v], v);
                if (s == S) {
                    prv[v].clear();
                    prv[v].push_back(u);
                }
            }
            else if (s == S && d[v] == dist + w) prv[v].push_back(u);
        }
    }
}

void dfs(int u) {
    vst[u] = true;
    for (int v: prv[u]) {
        nxt[v].push_back(u);
        if (!vst[v]) dfs(v);
    }
}

void dfs_dp(int u) {
    dp[u] = dV[u];
    for (int v: nxt[u]) {
        if (dp[v] == LLONG_MAX) dfs_dp(v);
        dp[u] = min(dp[u], dp[v]);
    }
}

void dfs_dp2(int u) {
    dp2[u] = dV[u];
    for (int v: prv[u]) {
        if (dp2[v] == LLONG_MAX) dfs_dp2(v);
        dp2[u] = min(dp2[u], dp2[v]);
    }
}

void init() {
    cin >> n >> m >> S >> T >> U >> V;
    for (int i = 0; i < m; ++i) {
        int u, v, w; cin >> u >> v >> w;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
    }
}

void solve() {
    init();

    memset(dS, 0x3f, sizeof dS), memset(dT, 0x3f, sizeof dT);
    memset(dU, 0x3f, sizeof dU), memset(dV, 0x3f, sizeof dV);
    dijkstra(S, dS), dijkstra(T, dT);
    dijkstra(U, dU), dijkstra(V, dV);
    dfs(T);

    for (int i = 1; i <= n; ++i) {
        dp[i] = dp2[i] = LLONG_MAX;
        if (!vst[i]) prv[i].clear();
    }
    dfs_dp(S);
    dfs_dp2(T);

    ll ans = dU[V];
    for (int i = 1; i <= n; ++i) {
        if (dS[i] + dT[i] != dS[T]) continue;
        ans = min(ans, dU[i] + min(dp[i], dp2[i]));
    }

    cout << ans;
}

int main() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    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...