#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int,int>>adj[100005];
int shop[100005];
int in[100005];
int out[100005];
int dis[100005];
int lv[100005];
int cur;
int inf=1e15;
int pa[20][100005];
int mn[20][100005];
int go[100005];
void dfs(int u,int p){
lv[u]=lv[p]+1;
in[u]=++cur;
dis[u]=inf;
if(shop[u])dis[u]=0;
for(auto [x,w]:adj[u])if(x!=p){
dfs(x,u);
dis[u]=min(dis[u],dis[x]+w);
}
out[u]=cur;
}
void efs(int u,int p,int d){
go[u]=d;
pa[0][u]=p;
mn[0][u]=-d+dis[u];
//cerr<<"u:"<<u<<' '<<dis[u]<<" "<<mn[0][u]<<"\n";
for(int i=1;i<=19;i++)pa[i][u]=pa[i-1][pa[i-1][u]],mn[i][u]=min(mn[i-1][u],mn[i-1][pa[i-1][u]]);
for(auto [x,w]:adj[u])if(x!=p){
efs(x,u,d+w);
}
}
int fans(int u,int x){
int uu=u;
int ans=inf;
for(int i=19;i>=0;i--)if(lv[pa[i][u]]>=lv[x])ans=min(ans,mn[i][u]),u=pa[i][u];
ans=min(ans,mn[0][u]);
//cerr<<"end:"<<u<<" "<<x<<":"<<ans<<"\n";
return ans+go[uu];
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,s,q,e;cin>>n>>s>>q>>e;
vector<pair<int,int>>v;
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});
v.push_back({a,b});
}
for(int i=1;i<=s;i++){
int x;cin>>x;
shop[x]=1;
}
dfs(e,0);
efs(e,0,0);
for(int i=0;i<q;i++){
int id,st;cin>>id>>st;
int x=max(make_pair(lv[v[id-1].first],v[id-1].first),make_pair(lv[v[id-1].second],v[id-1].second)).second;
//cerr<<x<<" "<<st<<"\n";
if(in[st]>=in[x]&&in[st]<=out[x]){
int ans=fans(st,x);
if(ans>=inf)cout<<"oo\n";
else cout<<ans<<"\n";
}else{
cout<<"escaped\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... |