제출 #1154907

#제출 시각아이디문제언어결과실행 시간메모리
1154907trinm01Commuter Pass (JOI18_commuter_pass)C++20
31 / 100
368 ms96524 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ll long long #define FOR(i, l, r) for (int i = (l); i <= (r); i++) #define FOD(i, r, l) for (int i = (r); i >= (l); i--) #define fi first #define se second #define pii pair<int, int> const ll mod = 1e9 + 7; const ll MAXN = 1e6 + 5; const ll oo = 1e18; int n, m, s1, t1, s2, t2, f1[MAXN], f2[MAXN], chk[MAXN], f[MAXN][4]; vector<pii> adj[MAXN], adj1[MAXN]; struct note { int u, v, c; } canh[MAXN]; void dijkstra1() { priority_queue<pii, vector<pii>, greater<pii>> q; FOR(i, 1, n) { f1[i] = oo; } f1[s1] = 0; q.push({0, s1}); while (q.size()) { auto [c, u] = q.top(); q.pop(); if (c > f1[u]) continue; for (auto &[v, w] : adj[u]) { if (f1[v] > f1[u] + w) { f1[v] = f1[u] + w; q.push({f1[v], v}); } } } } void dijkstra2() { priority_queue<pii, vector<pii>, greater<pii>> q; FOR(i, 1, n) { f2[i] = oo; } f2[t1] = 0; q.push({0, t1}); while (q.size()) { auto [c, u] = q.top(); q.pop(); if (c > f2[u]) continue; for (auto &[v, w] : adj[u]) { if (f2[v] > f2[u] + w) { f2[v] = f2[u] + w; q.push({f2[v], v}); } } } } void dijkstra() { priority_queue<pair<int, pii>, vector<pair<int, pii>>, greater<pair<int, pii>>> q; FOR(i, 1, n) { FOR(j, 0, 2) { f[i][j] = oo; } } FOR(j, 0, 2) { f[s2][j] = 0; q.push({0, {s2, j}}); } while (q.size()) { int c = q.top().fi; auto [u, tt] = q.top().se; q.pop(); if (c > f[u][tt]) { continue; } for (auto &[v, w] : adj1[u]) { FOR(j, 0, 2) { if (j == 1) continue; if (f[v][j] > f[u][tt] + w) { f[v][j] = f[u][tt] + w; q.push({f[v][j], {v, j}}); } } if (w == 0) { if (tt == 0) { if (f[v][1] > f[u][0]) { f[v][1] = f[u][0]; q.push({f[v][1], {v, 1}}); } } else if (tt == 1) { if (f[v][1] > f[u][1]) { f[v][1] = f[u][1]; q.push({f[v][1], {v, 1}}); } } else { if (f[v][2] > f[u][2] + w) { f[v][2] = f[u][2] + w; q.push({f[v][2], {v, 2}}); } } } else { if (tt == 0) { if (f[v][0] > f[u][0] + w) { f[v][0] = f[u][0] + w; q.push({f[v][0], {v, 0}}); } } else if (tt == 1) { if (f[v][2] > f[u][1] + w) { f[v][2] = f[u][1] + w; q.push({f[v][2], {v, 2}}); } } else { if (f[v][2] > f[u][2] + w) { f[v][2] = f[u][2] + w; q.push({f[v][2], {v, 2}}); } } } } } } signed main() { ios::sync_with_stdio(false); cin.tie(NULL); if (fopen("DAYCON.inp", "r")) { freopen("DAYCON.inp", "r", stdin); freopen("DAYCON.out", "w", stdout); } cin >> n >> m >> s1 >> t1 >> s2 >> t2; FOR(i, 1, m) { int u, v, c; cin >> u >> v >> c; adj[u].push_back({v, c}); adj[v].push_back({u, c}); adj1[u].push_back({v, c}); adj1[v].push_back({u, c}); canh[i] = {u, v, c}; canh[i + m] = {v, u, c}; } dijkstra1(); dijkstra2(); m *= 2; FOR(i, 1, m) { auto [u, v, c] = canh[i]; if (f1[u] + c + f2[v] == f1[t1]) { adj1[u].push_back({v, 0}); } } // cout << chk[4] << ' '; dijkstra(); int ans = oo; FOR(i, 0, 2) { ans = min(ans, f[t2][i]); } FOR(i, 1, n) { adj1[i].clear(); } FOR(i, 1, m) { auto [u, v, c] = canh[i]; // adj1[v].push_back({u, c}); adj1[u].push_back({v, c}); } FOR(i, 1, m) { auto [u, v, c] = canh[i]; if (f2[u] + c + f1[v] == f1[t1]) { adj1[u].push_back({v, 0}); } } dijkstra(); FOR(i, 0, 2) { ans = min(ans, f[t2][i]); } cout << ans; return 0; }

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

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:176:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  176 |         freopen("DAYCON.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:177:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  177 |         freopen("DAYCON.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...