在写P2515时,想要调试代码时,发现代码出现如题的问题,问如何解决。
直接在代码界面运行会产生如图效果:

代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+6;
const int M=1e9+7;
const int IM=2147483647;
const long long LLM=9223372036854775807;
inline int read()
{
int x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') y=-y;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^'0');c=getchar();}
return x*y;
}
int n,m,d,p,op,sc,tot,ans;
int w[N],du[N],cnt[2],id[N],stc[N],siz[N],num[N],pre[N];
int val[N],dfn[N],low[N],sizz[N],head[N][2],f[N][505];
bool vis[N];
struct node{
int u,v,nex;
}t[N][2];
void add(int u,int v,int id)
{
t[++cnt[id]][id]=(node){u,v,head[u][id]};
head[u][id]=cnt[id];
}
void tarjan(int u)
{
dfn[u]=low[u]=++tot;
stc[++sc]=u;
vis[u]=true;
for(int i=head[u][0];i;i=t[i][0].nex)
{
int v=t[i][0].v;
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]!=low[u]) return;
int top=stc[sc--];
vis[top]=false;
siz[++p]+=w[top];
num[top]=p;
while(top!=u)
{
top=stc[sc--];
vis[top]=false;
siz[p]+=w[top];
num[top]=p;
}
}
void dfs(int u)
{
id[++op]=u;
sizz[u]=1;
for(int i=head[u][1];i;i=t[i][1].nex)
{
int v=t[i][1].v;
pre[v]=pre[u]+siz[u];
dfs(v);
sizz[u]+=sizz[v];
}
}
signed main()
{
n=read();m=read();
for(int i=1;i<=n;i++) w[i]=read();
for(int i=1;i<=n;i++) val[i]=read();
for(int i=1;i<=n;i++) if(d=read()) add(d,i,0);
puts("bn");
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=cnt[0];i++)
{
int u=num[t[i][0].u],v=num[t[i][0].v];
if(u^v) add(u,v,1),du[v]++;
}
for(int i=1;i<=p;i++) if(!du[i]) add(0,i,1);
dfs(0);
for(int i=1;i<=op;i++)
{
for(int j=pre[id[i]];j<=m-siz[id[i]];j++)
f[i+1][j+siz[id[i]]]=max(f[i+1][j+siz[id[i]]],f[i][j+val[id[i]]]);
for(int j=pre[id[i]];j<=m;j++)
f[i+sizz[id[i]]][j]=max(f[i+sizz[id[i]]][j],f[i][j]);
}
printf("%d\n",f[op+1][m]);
return 0;
}