SMUSpring天梯賽1

ouhq發表於2024-03-14

補題1:龍龍送外賣

題意:SMUSpring天梯賽1SMUSpring天梯賽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;
    }
}

相關文章