【警示后人】犯sb错误,想紫砂了
查看原帖
【警示后人】犯sb错误,想紫砂了
261262
WaltVBAlston楼主2022/11/1 06:54

RT,本人考场T1写的dfs,感觉能过70分+,出来一测直接爆零。原因是因为:


int gohome(int node,int nowk){
	if(nowk<0)
		return 0;
	if(node==1)
		return 1;
	for(int i=now[node];i!=-1;i=before[i])
		if(gohome(v[i],nowk-1)==1)
			return 1;
}

这个函数没有写返回值。在本地运行和在线ide都是没啥问题的,但是可能因为评测机不同导致爆零,包括下面这个:


void dfs(int node,long long pn,int kn,int ns){
	cal++;
	if(cal>=350000000)
		cout<<ans;
	if(ns>4)
		return;
	if(kn<0)
		return;
   ......

cal在发现数据过大后输出答案,但是我忘记exit(0)了,导致这个小小的随机化并没有办法乱搞过。

警示后人!!!写函数一定要写返回值!!!

ps:补完返回值之后infoj 70 luogu 65 相似的心都有了

本来可以混个蓝勾勾玩的,现在属于是春春sb

顺便贴一下代码,想问一下为什么不写返回值会爆零死循环:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
long long p[2505];
int u[40005],v[40005],now[2505],before[40005];
bool vis[2505];
long long ans=0;
long long cal=0;
bool ok[2505];
long long maxn[2505][5];
inline long long read(){
	long long x=0,z=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')
			z=-1;
		c=getchar();
	}
	while(isdigit(c)){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar(); 
	}
	return z*x;
}
int gohome(int node,int nowk){
	if(nowk<0)
		return 0;
	if(node==1)
		return 1;
	for(int i=now[node];i!=-1;i=before[i])
		if(gohome(v[i],nowk-1)==1)
			return 1;
}
void dfs(int node,long long pn,int kn,int ns){
	cal++;
	if(cal>=350000000)
		cout<<ans;
	if(ns>4)
		return;
	if(kn<0)
		return;
	if(kn==0){
		if(vis[node]==true||node==1)
			return;
		pn+=p[node];
		ns++;
		if(maxn[node][ns]>=pn)
			return;
		maxn[node][ns]=pn;
		//cout<<node<<" "<<pn<<" "<<ns<<endl;
		vis[node]=true;
		if(ns==4){
			if(ok[node]){
				ans=max(ans,pn);
				vis[node]=false;
				return;
			}
			/*	
			for(int i=now[node];i!=-1;i=before[i])
				if(gohome(v[i],k)==1){
					//cout<<node<<" "<<pn<<endl;
					ans=max(ans,pn);
					vis[node]=false;
					return;
				}
			*/
			vis[node]=false;
			return;
		}
		for(int i=now[node];i!=-1;i=before[i]){
			for(int j=0;j<=k;j++){
				//cout<<u[i]<<" "<<v[i]<<endl;
				dfs(v[i],pn,j,ns);
			}
		}
		vis[node]=false;
	}
	else{
		for(int i=now[node];i!=-1;i=before[i])
			dfs(v[i],pn,kn-1,ns);
	}
	return;
}
int main(){
	//freopen("holiday.in","r",stdin);
	//freopen("holiday.out","w",stdout);
	n=read(),m=read(),k=read();
	p[1]=0,now[1]=-1;
	for(int i=2;i<=n;i++)
		p[i]=read(),now[i]=-1;
	for(int i=1;i<=m;i++){
		u[i]=read(),v[i]=read();
		before[i]=now[u[i]];
		now[u[i]]=i;
	}
	for(int i=m+1;i<=2*m;i++){
		u[i]=v[i-m],v[i]=u[i-m];
		before[i]=now[u[i]];
		now[u[i]]=i;
	}
	//cout<<"---------------------"<<endl;
	memset(ok,false,sizeof(ok));
	for(int i=1;i<=n;i++)
		if(gohome(i,k+1)==1)
			ok[i]=true;
	memset(vis,false,sizeof(vis));
	for(int i=now[1];i!=-1;i=before[i])
		for(int j=0;j<=k;j++)
			dfs(v[i],0,j,0);
	cout<<ans;
	return 0;
}
	

(在gohome函数里,这个函数是用来判断当前节点是否能回家的)

2022/11/1 06:54
加载中...