제출 #897165

#제출 시각아이디문제언어결과실행 시간메모리
897165LittleFlowers__Commuter Pass (JOI18_commuter_pass)C++17
31 / 100
624 ms32084 KiB
#include <bits/stdc++.h> using namespace std; string to_string(string s) { return '"' + s + '"'; } string to_string(const char* s) { return to_string((string) s); } string to_string(bool b) { return (b ? "true" : "false"); } template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template <typename A> string to_string(A v) { bool first = true; string res = "{"; for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); } res += "}"; return res; } void debug_out() { cerr << endl; } template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << to_string(H); debug_out(T...); } #ifdef LOCAL #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif #define int long long int32_t main() { if (fopen("input.txt", "r")) { freopen("input.txt", "r", stdin); } cin.tie(0)->sync_with_stdio(0); using ii = pair<int, int>; int n, m, S, T, U, V; cin >> n >> m >> S >> T >> U >> V; vector<vector<ii>> ad(n + 1); for (int i = 0; i < m; ++i) { int u, v, c; cin >> u >> v >> c; ad[u].push_back({v, c}); ad[v].push_back({u, c}); } vector<int> fs(n + 1), ft(n + 1), fu(n + 1), fv(n + 1); function dijkstra = [&](int u, vector<int> &f) { fill(f.begin(), f.end(), 1e14); priority_queue<ii, vector<ii>, greater<ii>> q; q.push({f[u] = 0, u}); while (q.size()) { auto [w, u] = q.top(); q.pop(); for (auto [v, c] : ad[u]) { if (f[v] > w + c) { f[v] = w + c; q.push({f[v], v}); } } } }; dijkstra(S, fs); dijkstra(T, ft); dijkstra(U, fu); dijkstra(V, fv); int answer = LLONG_MAX; for (int i = 0; i < 2; ++i) { vector<vector<int>> f(n + 1, vector<int>(2, 1e14)); using iii = tuple<int, int, int>; priority_queue<iii, vector<iii>, greater<iii>> q; q.push(make_tuple(f[U][0] = 0, U, 0)); while (q.size()) { auto [w, u, s] = q.top(); q.pop(); answer = min(answer, w + fv[u]); for (auto [v, c] : ad[u]) { auto onpath = fs[u] + c + ft[v] == fs[T]; if (f[v][s] > w + c) { f[v][s] = w + c; q.push(make_tuple(f[v][s], v, s)); } if (onpath && f[v][1] > w) { f[v][1] = w; q.push(make_tuple(f[v][1], v, 1)); } } } swap(U, V); swap(fu, fv); } cout << answer << '\n'; }

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

commuter_pass.cpp: In function 'int32_t main()':
commuter_pass.cpp:55:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |     freopen("input.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...