P-1007模拟
题目如下:
根据题意可知很容易想到dfs
首先在建立树方面我想到的用vector容器
考虑贪心,对于一个子树,维护这个子树里面答案的最小值和在这个子树根的人最多还能走几步。
for(int i=2;i<=n;i++){
int fu;
cin>>fu;//父节点
tree[fu].push_back(i);
}
之后就直接进行简单的dfs遍历就好了
总代码如下:
#include<iostream>
#include<vector>
using namespace std;
int n,k,num[100010],last[100010];
//last数组表示当前结点往上走的次数
vector<int> tree[100010];
void dfs(int now,int fa){
last[now]=k;
for(int i=0;i<tree[now].size();i++){
int son=tree[now][i];
dfs(son,now);
if(num[son]&&last[son]){
num[now]+=num[son];
num[son]=0;
last[now]=min(last[now],last[son]-1);
}
}
}
int main(){
int T;
cin>>T;
while(T--){
cin>>n>>k;
for(int i=1;i<=n;i++) tree[i].clear();
for(int i=2;i<=n;i++){
int fu;
cin>>fu;
tree[fu].push_back(i);
}
for(int i=1;i<=n;i++){
cin>>num[i];
}
dfs(1,-1);
int ans=0;
for(int i=1;i<=n;i++){
if(num[i]) ans++;
}
cout<<ans<<endl;
}
return 0;
}
萌新第一次 有错误麻烦各位大佬指出qwq