求助站外题bfsTLE
  • 板块题目总版
  • 楼主ajahjahah
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/2/4 19:42
  • 上次更新2023/10/28 09:42:00
查看原帖
求助站外题bfsTLE
357378
ajahjahah楼主2022/2/4 19:42

题目描述:

nn 个点排成一排,第 ii 个点都有一个分数 aia_i

一个人从 11 号点出发,要走到 nn 号点。当这个人在 ii点时时,这个人可以选择走到i+1i+1点,也可以跳到tit_i

假如这个人的得分就是一路上路过的所有点上分数之和,请问应该如何安排行动,才能使获得的分数之和达到最高?

输入格式:

第一行为正整数 n(1n105)n(1\leq n\leq10^5)

第二行为nn 个整数,aia_i表示ii号点的分数(105ai105)(-10^5\leq a_i \leq 10^5)

第三行为n1n-1个整数,tit_i表示ii点可以跳到的地方(i<tin)(i < t_i \leq n)

输出格式:

输出一个整数,表示可能拿到的最高分数

样例输入:

3
4 -2 6
3 3

样例输出:

10

以下为我的代码

#include<bits/stdc++.h>
using namespace std;
int n,ans;
int a[200005],t[200005];
struct step{
	int place,num;
};
void bfs(int start){
	queue<step> b;
	b.push((step){start,a[start]});
	while(!b.empty()){
		int st=b.front().place;
		int point=b.front().num;
		b.pop();
		if(st==n){
			ans=max(ans,point);
		}
		else{
			b.push((step){st+1,point+a[st+1]});
			b.push((step){t[st],point+a[t[st]]});
		}
	}
}
int main(){
	//freopen("test.in","r",stdin);
	//freopen("test.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<n;i++){
		cin>>t[i];
	}
	bfs(1);
	cout<<ans; 
	return 0;
}

虽然样例过了

但是7070%都是运行超时(应该是TLE的意思)

想看一下代码里面为什么错了

题目出处

2022/2/4 19:42
加载中...