#include <bits/stdc++.h>
using namespace std;
#define FOR(i, l, r) for(int i = (l); i < (r); ++i)
#define ROF(i, r, l) for(int i = (r) - 1; i >= (l); --i)
#define mp make_pair
#define mt make_tuple
#define ff first
#define ss second
#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)
#define sz(v) (int)v.size()
#define compact(v) v.erase(unique(all(v)), end(v))
#define pb push_back
#define eb emplace_back
#define readFile(task) freopen(task, "r", stdin)
#define writeFile(task) freopen(task, "w", stdout)
#define dbg(x) "[" #x " = " << (x) << "]"
template<typename T>
bool minimize(T& a, const T& b){
if(a > b) return a = b, true;
return false;
}
template<typename T>
bool maximize(T& a, const T& b){
if(a < b) return a = b, true;
return false;
}
using ll = long long;
using db = double;
using str = string;
using ull = unsigned long long;
using ldb = long double;
using pi = pair<int, int>;
using pl = pair<ll, ll>;
using pd = pair<db, db>;
using vi = vector<int>;
using vl = vector<ll>;
using vb = vector<bool>;
using vc = vector<char>;
using vs = vector<str>;
using vpi = vector<pi>;
using vpl = vector<pl>;
using vpd = vector<pd>;
using vvi = vector<vi>;
using vvl = vector<vl>;
void setIO(){
ios_base::sync_with_stdio(0); cin.tie(0);
#ifdef LOCAL
readFile("task.inp");
writeFile("task.out");
#endif // LOCAL
}
template<typename T, typename U>
ostream& operator << (ostream& out, const pair<T, U>& p){
return out << "(" << p.ff << ", " << p.ss << ")";
}
const int MAX = 2e3 + 5;
const int BOUND = 1e5 + 5;
const ll inf = 1e15;
struct edge{
int u, v, w;
edge() : u(), v(), w(){}
edge(int u, int v, int w) : u(u), v(v), w(w) {}
int get(int x){ return x ^ u ^ v; }
} e[MAX];
int N, M, L, T, nn, deg[MAX], X[BOUND];
pi inv[MAX * 2];
vi adj[MAX];
int idx[MAX][MAX];
vl F[MAX * 2], G[MAX * 2];
using nd = pair<ll, int>;
vl dijkstra_with_obstacles(int p){
vl d(nn, inf);
d[p] = 0;
// cout << dbg(inv[p]) << '\n';
priority_queue<nd, vector<nd>, greater<nd>> pq;
pq.push(mp(0, p));
while(!pq.empty()){
ll dist; int pos; tie(dist, pos) = pq.top(); pq.pop();
if(d[pos] != dist) continue;
int u, bid; tie(u, bid) = inv[pos];
// cout << dbg(inv[pos]) << dbg(dist) << '\n';
for(auto id : adj[u]) if(bid != id){
int v = e[id].get(u);
int to = idx[v][id];
// cout << dbg(v) << dbg(id) << dbg(to) << '\n';
if(minimize(d[to], d[pos] + e[id].w)){
pq.push(mp(d[to], to));
}
}
}
// cout << '\n';
return d;
}
vl dijkstra_without_obstacles(int s){
vl d(nn, inf);
priority_queue<nd, vector<nd>, greater<nd>> pq;
for(auto id : adj[s]){
int v = e[id].get(s);
d[idx[v][id]] = e[id].w;
pq.push(mp(e[id].w, idx[v][id]));
}
// cout << dbg(s) << '\n';
while(!pq.empty()){
ll dist; int pos; tie(dist, pos) = pq.top(); pq.pop();
if(d[pos] != dist) continue;
// cout << dbg(inv[pos]) << ' ' << dist << '\n';
int u, bid; tie(u, bid) = inv[pos];
for(auto id : adj[u]) if(bid != id){
int v = e[id].get(u);
int to = idx[v][id];
if(minimize(d[to], d[pos] + e[id].w)){
pq.push(mp(d[to], to));
}
}
}
// cout << '\n';
return d;
}
ll solve(){
vl dp(nn, inf);
for(auto id : adj[X[1]]){
int des = idx[X[1]][id];
dp[des] = G[X[0]][des];
// cout << inv[des] << " : " << dp[des] << '\n';
}
FOR(i, 1, L-1){
vl nw(nn, inf);
for(auto id_des : adj[X[i+1]]){
int des = idx[X[i+1]][id_des];
for(auto id_st : adj[X[i]]){
int st = idx[X[i]][id_st];
minimize(nw[des], dp[st] + F[st][des]);
}
}
swap(dp, nw);
}
ll result = *min_element(all(dp));
if(result == inf) result = -1;
return result;
}
void testcase(){
cin >> N >> M >> T >> L;
memset(idx, -1, sizeof(idx));
FOR(i, 0, M){
int u, v, w;
cin >> u >> v >> w;
--u, --v;
e[i] = edge(u, v, w);
adj[u].eb(i);
adj[v].eb(i);
inv[idx[u][i] = nn++] = mp(u, i);
inv[idx[v][i] = nn++] = mp(v, i);
}
// FOR(i, 0, nn) cout << dbg(inv[i]) << '\n'; cout << '\n';
// FOR(i, 0, N) for(auto j : adj[i]) cout << i << ' ' << j << '\n';
FOR(i, 0, nn) F[i] = dijkstra_with_obstacles(i);
FOR(i, 0, N) G[i] = dijkstra_without_obstacles(i);
FOR(i, 0, L) cin >> X[i], --X[i];
while(T--){
int P, Q;
cin >> P >> Q;
--P, --Q;
X[P] = Q;
cout << solve() << '\n';
}
}
int main(){
setIO();
int T = 1;
// cin >> T;
while(T--) testcase();
return 0;
}
# | 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... |