求助!!
  • 板块灌水区
  • 楼主zhangboyan12
  • 当前回复4
  • 已保存回复5
  • 发布时间2024/8/22 15:41
  • 上次更新2024/8/22 16:29:17
查看原帖
求助!!
1273661
zhangboyan12楼主2024/8/22 15:41

题目在这里

#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;
}

怎么改?本代码是出题人发的但是不对

2024/8/22 15:41
加载中...