제출 #1327894

#제출 시각아이디문제언어결과실행 시간메모리
1327894daotuankhoiCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
182 ms22300 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define ll long long

#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif

template <class T> bool ckmax(T &a, T b) { return a < b ? (a = b, true) : false; }
template <class T> bool ckmin(T &a, T b) { return a > b ? (a = b, true) : false; }

const int MAXN = 1e5 + 5;

vector<pair<int, int>> g[MAXN];
int n, m, s, t, u, v;
ll ds[MAXN], dt[MAXN], du[MAXN], dv[MAXN], dp[MAXN], dp1[MAXN];
pair<pair<int, int>, int> e[MAXN * 2];
void dijkstra(int st, ll d[MAXN]) {
    using T = pair<ll, int>;
    d[st] = 0;
    priority_queue<T, vector<T>, greater<T>> pq;
    pq.emplace(0, st);
    while (pq.size()) {
        auto [dd, u] = pq.top();
        pq.pop();
        if (dd > d[u]) continue;
        for (auto [v, w] : g[u]) {
            if (ckmin(d[v], d[u] + w)) {
                pq.emplace(d[v], v);
            }
        }
    }
}

vector<int> adj[MAXN];
int in[MAXN];

int main() {
    #define NAME ""
    if (fopen(NAME".inp", "r")) {
        freopen(NAME".inp", "r", stdin);
        freopen(NAME".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m >> s >> t >> u >> v;
    for (int i = 1; i <= m; i++) {
        int u, v, w; cin >> u >> v >> w;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
        e[i] = {{u, v}, w};
    }
    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);
    for (int i = 1; i <= m; i++) {
        int u = e[i].fi.fi;
        int v = e[i].fi.se;
        int w = e[i].se;
        if (ds[u] + w + dt[v] == ds[t] && ds[u] < ds[v])
            adj[u].push_back(v), in[v]++;

        if (ds[v] + w + dt[u] == ds[t] && ds[v] < ds[u])
            adj[v].push_back(u), in[u]++;
    }
    queue<int> q;
    for (int i = 1; i <= n; i++) {
        if (in[i] == 0) q.emplace(i);
    }
    vector<int> topo;
    while (q.size()) {
        int u = q.front(); q.pop();
        topo.emplace_back(u);
        for (int v : adj[u]) {
            if (--in[v] == 0) {
                q.emplace(v);
            }
        }
    }
    assert((int)topo.size() == n);
    ll ans = du[v];
    memset(dp, 0x3f, sizeof dp);
    memset(dp1, 0x3f, sizeof dp1);
    for (int i : topo) {
        ckmin(dp[i], du[i]);
        ckmin(dp1[i], dv[i]);
//        debug(i, dp[i]);
        for (int j : adj[i]) {
            ckmin(dp[j], dp[i]);
            ckmin(dp1[j], dp1[i]);
        }
    }
    for (int i = 1; i <= n; i++) ckmin(ans, dp[i] + dv[i]), ckmin(ans, dp1[i] + du[i]);
    cout << ans << '\n';
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:47:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |         freopen(NAME".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:48:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |         freopen(NAME".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...