補題1:龍龍送外賣
題意:
做法:思維--遍歷方式,從輸入的點往外賣點遍歷,或標記過的點。回溯的時候更新深度!
//到達了最後一個送貨點之後不用返回根結點.那麼之前到達的點都是要折返點,那麼就最後才送最深點節點。
//還有就是如果在去節點8點時候,途徑了節點2,那麼這個時候去節點2的路可以忽略,因為是順路的。
//一邊讀入一邊遍歷,從輸入的點開始,往上走.直到到達外賣站或到達一個被標記過的點,停止.
// 回溯的時候更新深度!! 而且dfs不是void型別,要返回該次點增加的代價.並且要更新deepest.輸出sum-deepest即可.
int n,q,s,ans=0,deepest=0;
int fa[100005],depth[100005];
unordered_map<int,bool> mark;
int dfs(int cur,int d){
if(cur==s||mark[cur]){
deepest=max(deepest,depth[cur]+d);
return 2*d;
}
int res=0; //res
res+=dfs(fa[cur],d+1);
depth[cur]=depth[fa[cur]]+1;
mark[cur]=1;
deepest=max(deepest,depth[cur]);
return res;
}
void solve(){ //補7-11--龍龍送外賣--思維-遍歷方式
//到達了最後一個送貨點之後不用返回根結點.那麼之前到達的點都是要折返點,那麼就最後才送最深點節點。
//還有就是如果在去節點8點時候,途徑了節點2,那麼這個時候去節點2的路可以忽略,因為是順路的。
//一邊讀入一邊遍歷,從輸入的點開始,往上走.直到到達外賣站或到達一個被標記過的點,停止.
// 回溯的時候更新深度!!
cin>>n>>q;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x==-1) s=i;
else fa[i]=x;
}
while(q--){
int x;
cin>>x;
ans+=dfs(x,0);
cout<<ans-deepest<<endl;
}
}