제출 #1251730

#제출 시각아이디문제언어결과실행 시간메모리
1251730duckindogWild Boar (JOI18_wild_boar)C++20
12 / 100
18088 ms1372 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2000 + 10, L = 100'000 + 10; int n, m, q, l; vector<pair<int, int>> ad[N]; int x[L]; const long long MAX = 1'000'000'000'000'000; long long dist[N][N]; void sktra(int st) { for (int i = 1; i <= n; ++i) { if (i == st) continue; fill(dist[i], dist[i] + n + 1, MAX); } using TP = tuple<long long, int, int>; priority_queue<TP, vector<TP>> pq; for (const auto& [v, w] : ad[st]) pq.emplace(dist[st][v], st, v); while (pq.size()) { auto [d, u, p] = pq.top(); pq.pop(); if (d != dist[u][p]) continue; for (const auto& [v, w] : ad[u]) { if (v != p && dist[v][u] > d + w) { pq.push({dist[v][u] = d + w, v, u}); } } } } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> m >> q >> l; for (int i = 1; i <= m; ++i) { int u, v, w; cin >> u >> v >> w; ad[u].push_back({v, w}); ad[v].push_back({u, w}); } for (int i = 1; i <= l; ++i) cin >> x[i]; for (int i = 1; i <= n; ++i) { ad[i].push_back({0, 0}); fill(dist[i], dist[i] + n + 1, MAX); } while (q--) { int p, nX; cin >> p >> nX; x[p] = nX; { // reset for (int i = 1; i <= n; ++i) { for (const auto& [v, w] : ad[i]) dist[i][v] = MAX; } } { // cal dist[x[1]][0] = 0; for (int i = 1; i < l; ++i) sktra(x[i]); } long long answer = *min_element(dist[x[l]], dist[x[l]] + n + 1); cout << (answer == MAX ? -1ll : answer) << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...