#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int mxN = 1e5+10;
const ll INF = 1e18;
vector<array<int, 2>> adj[mxN];
int anc[mxN][20], sub_esc[mxN], d[mxN];
ll dist[mxN], mn[mxN];
bool sp[mxN];
void jmp(int &x, int dist) {
for(int k = 19; k >= 0; k--) {
if(dist & (1 << k)) x = anc[x][k];
}
}
int lca(int a, int b) {
if(d[b] > d[a]) swap(a, b);
jmp(a, d[a]-d[b]);
if(a == b) return a;
for(int k = 19; k >= 0; k--) {
if(anc[a][k] != anc[b][k]) {
a = anc[a][k];
b = anc[b][k];
}
}
return anc[a][0];
}
void dfs(int node, int p, int e) {
anc[node][0] = p;
for(int k = 1; k <= 19; k++) {
anc[node][k] = anc[anc[node][k-1]][k-1];
}
for(auto [it, w] : adj[node]) {
if(it == p) continue;
d[it] = d[node]+1;
dist[it] = dist[node] + w;
dfs(it, node, e);
sub_esc[node] |= sub_esc[it];
mn[node] = min(mn[node], mn[it] + w);
}
if(node == e) sub_esc[node] = 1;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, s, q, e;
cin >> n >> s >> q >> e;
vector<array<int, 3>> queries;
for(int i = 1; i < n; i++) {
int a, b, w;
cin >> a >> b >> w;
adj[a].push_back({b, w});
adj[b].push_back({a, w});
queries.push_back({a, b, w});
mn[i] = INF;
}
mn[n] = INF;
for(int i = 0; i < s; i++) {
int k;
cin >> k;
sp[k] = true;
mn[k] = 0;
}
dfs(1, 0, e);
while(q--) {
int idx; int k;
cin >> idx >> k; --idx;
int a = queries[idx][0], b = queries[idx][1];
if(d[b] < d[a]) swap(a, b);
bool fnd = true;
if(d[k] >= d[b]) {
int anc1 = lca(b, k);
if(sub_esc[b] && anc1 != b) {
fnd = false;
}
else if(!sub_esc[b] && anc1 == b) {
fnd = false;
}
else {
cout << "escaped\n";
}
}
else {
if(sub_esc[b]) {
fnd = false;
}
else {
cout << "escaped\n";
}
}
if(fnd) continue;
ll ans = INF;
int anc1 = lca(b, k);
if(anc1 == b) {
int x = k;
while(x != b) {
if(mn[x] != INF) ans = min(ans, dist[k] - 2*dist[x] + mn[x]);
x = anc[x][0];
}
if(mn[x] != INF) ans = min(ans, dist[k] - dist[x] + mn[x]);
if(ans == INF) cout << "oo\n";
else cout << ans << '\n';
continue;
}
for(int i = 1; i <= n; i++) {
if(sp[i]) {
int anc2 = lca(i, b);
int anc3 = lca(i, k);
if(anc2 == b && anc1 == b) {
ans = min(ans, dist[k] + dist[i] - 2*dist[anc3]);
}
else if(anc2 != b && anc1 != b) {
ans = min(ans, dist[k] + dist[i] - 2*dist[anc3]);
}
}
}
if(ans == INF) cout << "oo\n";
else cout << ans << '\n';
}
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... |