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函数里,这个函数是用来判断当前节点是否能回家的)