考试的时候只拿了60分,超时了,回家重开了一遍过了:
#include<bits/stdc++.h>
using namespace std;
long long weight_delta[4005];
int weight[4005];
int father[4005];
long long weight_sum[4005];
bool live[4005];
bool temp[4005]={true};
vector<int> son[4005];
int res=0;
int n,m;
int main(){
cin>>n>>m;
void query(int index);
for(int i=1;i<=n;i++){
cin>>weight[i];
}
for(int i=2;i<=n;i++){
cin>>father[i];
son[father[i]].push_back(i);
}
for(int i=0;i<m;i++){
int q;
cin>>q;
query(q);
cout<<endl;
}
}
void DFS(int index){
weight_sum[index]+=weight[index];
for(auto item:son[index]) {
DFS(item);
if(live[item]) {
weight_sum[index] += weight_sum[item];
}
}
}
int initialize(){
for(int i=1;i<=n;i++){
weight_sum[i]=0;
}
long long total_weight=0;
for(int i=1;i<=n;i++){
if(live[i]){
total_weight+=weight[i];
}
}
DFS(1);
// for(int i=1;i<=n;i++){
// cout<<weight_sum[i]<<" ";
// }
for(int i=1;i<=n;i++){
weight_delta[i]= abs(total_weight-weight_sum[i]-weight_sum[i]);
}
// for(int i=1;i<=n;i++){
// cout<<weight_delta[i]<<" ";
// }
long long min=INT64_MAX;
int min_index;
for(int i=1;i<=n;i++)
{
if(weight_delta[i]<min&&live[i]){
min=weight_delta[i];
min_index=i;
}
}
return min_index;
}
void dfs(int index,int op){
if(op==0){
temp[index]=live[index];
for(auto item:son[index]){
temp[item]=live[item];
dfs(item,op);
}
}
if(op==1){
live[index]=false;
for(auto item:son[index]){
live[item]=false;
// cout<<item;
dfs(item,op);
}
}
}
void delete_node(int index,int op){
// cout<<index<<" "<<op<<endl;
if(op==0){
for(int i=1;i<=n;i++){
temp[i]=false;
}
dfs(index,op);
for(int i=1;i<=n;i++){
live[i]=temp[i];
}
}
else{
dfs(index,op);
}
}
bool search(int f,int s){
// cout<<f<<" "<<s<<endl;
if(f==s){
return true;
}
for(auto item:son[f]){
search(item,s);
if(item==s){
res=1;
}
}
if(res==0){
return false;
}
if(res!=0){
return true;
}
}
void query(int index){
for(int i=1;i<=n;i++){
live[i]=true;
}
while(true){
//for(int t=0;t<5;t++){
int min_index=initialize();
// for(int i=1;i<=n;i++){
//
// cout<<weight_delta[i]<<" ";
// }
// for(int i=1;i<=n;i++){
// cout<<live[i]<<" ";
// }
// cout<<endl;
int flag=0;
for(int i=1;i<=n;i++){
if(live[i]){
flag++;
}
}
if(flag==1){
break;
}
cout<<min_index<<" ";
res=0;
delete_node(min_index,!search(min_index,index));
}
}