30pts求调
查看原帖
30pts求调
772398
wosyioq_1367楼主2025/1/22 23:54

记录详情

#include<bits/stdc++.h>
#define M 100010
using namespace std;
int n,p[M],is[M];
int ans,cnt,x[M];
vector<int> g[M];
stack<int> s;
void dfs(int u,int v){
    while(x[u]--)s.push(u);
    if(is[u]){
        if(!s.empty()){
            ans++;
            while(!s.empty()&&s.top()==u)s.pop();
            return;
        }
    }
    for(int i=0;i<g[u].size();i++)if(g[u][i]!=v)dfs(g[u][i],u);
	while(!s.empty()&&s.top()==u)s.pop();
}
int main(){
    cin>>n;cnt=n-1;
    for(int i=1;i<=n;i++)cin>>p[i];
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
        is[u]++,is[v]++;
    }
    for(int i=2;i<=n;i++)if(is[i]!=1)is[i]=0,cnt--;
    for(int i=1;i<=cnt;i++)x[p[i]]++;
    dfs(1,0);
    cout<<ans;
    return 0;
}
2025/1/22 23:54
加载中...