#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |