哪位大佬帮我看看为什么RE了,玄关
查看原帖
哪位大佬帮我看看为什么RE了,玄关
533297
Patronus楼主2023/11/10 11:21
#include<bits/stdc++.h>
using namespace std;
const int N=1005,M=1e4+5;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(!isdigit(c) && c!='-') c=getchar();
    if(c=='-') f=-1,c=getchar();
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
int f[N][N];
int head[N],ver[M],Next[M],tot;
int hc[N],vc[M],nc[M],deg[N],tot2;
int dfn[N],low[N],st[N],ins[N],c[N];
int w[N],v[N],W[N],V[N];
int n,m,num,top,cnt;
void add(int x,int y){
    ver[tot]=y; Next[tot]=head[x]; head[x]=tot++;
}
void add_c(int x,int y){
    vc[tot2]=y; nc[tot2]=hc[x]; hc[x]=tot2++;
}
void tarjan(int x){
    dfn[x]=low[x]=++num;
    st[++top]=x; ins[x]=1;
    for(int i=head[x];~i;i=Next[i]){
        int y=ver[i];
        if(dfn[y]){
            tarjan(y);
            low[x]=min(low[x],low[y]);
        }
        else if(ins[y])
            low[x]=min(low[x],dfn[y]);
    }
    if(dfn[x]==low[x]){
        cnt++; int y;
        do{
            y=st[top--]; ins[y]=0;
            c[y]=cnt;
            W[cnt]+=w[y]; V[cnt]+=v[y];
        }while(x!=y);
    }
}
void dfs(int x){
    for(int i=W[x];i<=m;i++) f[x][i]=V[x];
    for(int i=hc[x];~i;i=nc[i]){
        int y=vc[i];
        dfs(y);
        for(int j=m;j>=W[x];j--){
            for(int k=0;k<=j-W[x];k++){
                f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]);
            }
        }
    }
}
int main(){
    //freopen(Name ".in", "r", stdin);
    //freopen(Name ".out", "w", stdout);
    memset(head,-1,sizeof(head));
    n=read(); m=read();
    for(int i=1;i<=n;i++) w[i]=read();
    for(int i=1;i<=n;i++) v[i]=read();
    for(int i=1;i<=n;i++){
        int d=read();
        if(d) add(d,i);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i]) tarjan(i);
    }
    memset(hc,-1,sizeof(hc));
    for(int x=1;x<=n;x++){
        for(int i=head[x];~i;i=Next[i]){
            int y=ver[i];
            if(c[x]==c[y]) continue;
            add_c(c[x],c[y]); deg[c[y]]++;
        }
    }
    for(int i=1;i<=cnt;i++){
        if(!deg[i]) add_c(0,i);
    }
    dfs(0);
    printf("%d\n",f[0][m]);
    return 0;
}
2023/11/10 11:21
加载中...