Submission #1004704

#TimeUsernameProblemLanguageResultExecution timeMemory
1004704MilosMilutinovic날다람쥐 (JOI14_ho_t4)C++14
100 / 100
194 ms30900 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, x; cin >> n >> m >> x; vector<int> h(n); for (int i = 0; i < n; i++) { cin >> h[i]; } vector<vector<pair<int, int>>> g(n); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; --u; --v; if (w <= h[u]) { g[u].emplace_back(v, w); } if (w <= h[v]) { g[v].emplace_back(u, w); } } const long long inf = (long long) 1e18; vector<vector<long long>> dist(n, vector<long long>(2, inf)); dist[0][1] = 0; dist[0][0] = x; vector<int> cur(n); cur[0] = x; set<tuple<long long, int, int>> st; st.emplace(dist[0][0], 0, 0); st.emplace(dist[0][1], 0, 1); vector<vector<bool>> was(n, vector<bool>(2)); while (!st.empty()) { auto it = st.begin(); long long d = get<0>(*it); int v = get<1>(*it); int t = get<2>(*it); st.erase(it); if (was[v][t] || d != dist[v][t]) { continue; } was[v][t] = true; int c = (t == 0 ? 0 : cur[v]); for (auto& e : g[v]) { int u = e.first; int w = e.second; if (c <= w) { if (dist[u][0] > dist[v][t] + 2 * w - c) { dist[u][0] = dist[v][t] + 2 * w - c; st.emplace(dist[u][0], u, 0); } } else { int nc = c - w; if (dist[u][1] > dist[v][t] + w + max(0, nc - h[u])) { dist[u][1] = dist[v][t] + w + max(0, nc - h[u]); cur[u] = min(h[u], nc); st.emplace(dist[u][1], u, 1); } } } } long long res = min(dist[n - 1][0] + h[n - 1], dist[n - 1][1] + h[n - 1] - cur[n - 1]); if (res >= inf) { cout << -1 << '\n'; } else { cout << res << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...