题目在这里
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+50;
int n,m,x,y,s;//n代表点数,m代表边数, s代表技能点
int son[N][3],fa[N],val[N],root;//分别代表儿子、父亲、科技值、根
long long ans;//能获得的最大科技值
void dfs(int x,long long sum,int s){//求所有路径和答案
sum+=val[x];//计数器,目前一步获得的科技值
if(!son[x][1]||s==0){//走完了
ans=max(ans,sum);//更新最大值
return;
}
dfs(son[x][1],sum,s-1);//遍历左儿子
if(son[x][2]) dfs(son[x][2],sum,s-1);//如果有右儿子,遍历右儿子
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
cin>>x>>y;
fa[y]=x;//x是y的父亲
if(!son[x][1]) son[x][1]=y;
else son[x][2]=y;//建边,如果只有一条边则默认左儿子
}
for(int i=1;i<=n;i++){
cin>>val[i];
}
for(int i=1;i<=m;i++){
if(!fa[i]){//找根
root=i;
break;
}
}
dfs(root,0,s - 1);//开始搜索
cout<<ans;//输出答案
return 0;
}
怎么改?本代码是出题人发的但是不对