제출 #1241891

#제출 시각아이디문제언어결과실행 시간메모리
1241891g4yuhgCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
197 ms31272 KiB
#pragma GCC optimize("O3,unroll-loops,Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
#define fii first
#define sei second
const ll inf = 1e18;
const int N = 100005;

int n, m, s, t, x, y;
ll d[4][N], ans = inf;
bool vst[N];
vector<pair<int, ll>> adj[N];
vector<int> adj2[N];

struct Edge { int u, v; ll w; };
vector<Edge> edges;
ll minx[N], miny[N];

void dijkstra(int st, int id) {
    for (int i = 1; i <= n; i++) d[id][i] = inf;
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
    d[id][st] = 0;
    pq.push({0, st});
    while (!pq.empty()) {
        auto [dist, u] = pq.top(); pq.pop();
        if (dist > d[id][u]) continue;
        for (auto &pr : adj[u]) {
            int v = pr.fii; ll w = pr.sei;
            if (d[id][v] > dist + w) {
                d[id][v] = dist + w;
                pq.push({d[id][v], v});
            }
        }
    }
}

void dfs2(int u) {
    vst[u] = true;
    minx[u] = miny[u] = inf;
    for (int v : adj2[u]) {
        if (!vst[v]) dfs2(v);
        ans = min(ans, d[2][u] + miny[v]);
        ans = min(ans, d[3][u] + minx[v]);
        minx[u] = min(minx[u], minx[v]);
        miny[u] = min(miny[u], miny[v]);
    }
    minx[u] = min(minx[u], d[2][u]);
    miny[u] = min(miny[u], d[3][u]);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> m >> s >> t >> x >> y;
    edges.reserve(m);
    for (int i = 0; i < m; i++) {
        int u, v; ll w;
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
        edges.push_back({u, v, w});
    }
    dijkstra(s, 0);
    dijkstra(t, 1);
    dijkstra(x, 2);
    dijkstra(y, 3);

    ll ST = d[0][t];
    for (int i = 1; i <= n; i++) {
        adj2[i].clear();
        vst[i] = false;
    }
    for (auto &e : edges) {
        int u = e.u, v = e.v; ll w = e.w;
        if (d[0][u] + w + d[1][v] == ST) adj2[u].push_back(v);
        if (d[0][v] + w + d[1][u] == ST) adj2[v].push_back(u);
    }

    ans = d[2][y];
    dfs2(s);
    cout << ans;
    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...