提交时间:2024-11-03 21:44:09
运行 ID: 34243
#include<iostream> #include<cstring> using namespace std; #define int long long const int N=5010,inf=0x3f3f3f3f3f3f3f3f; inline int read(){ int i=getchar(),r=0,s=1; while(i<'0'||i>'9'){if(i=='-')s=-1;i=getchar();} while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return s*r; } int n,s,w[N],p[N],fa[N]; int deg[N],q[N],front,back; int son[N],bro[N]; int rt[N],cnt; void init(){ memset(deg,0,(n+5)*sizeof(int)); memset(son,0,(n+5)*sizeof(int)); memset(bro,0,(n+5)*sizeof(int)); n=read(),s=read(); for(int i=1;i<=n;i++)w[i]=read(); for(int i=1;i<=n;i++)p[i]=read(); for(int i=1;i<=n;i++)fa[i]=read(),deg[fa[i]]++; front=back=cnt=0; for(int i=1;i<=n;i++)if(!deg[i])q[++back]=i; while(front<back){ int nd=q[++front]; bro[nd]=son[fa[nd]]; son[fa[nd]]=nd; if(!--deg[fa[nd]])q[++back]=fa[nd]; } if(deg[s]){ rt[cnt++]=s; while(fa[rt[cnt-1]]!=rt[0])rt[cnt]=fa[rt[cnt-1]],cnt++; } } int f[N][N],mx[N][N]; void dp(int nd){ for(int i=son[nd];i;i=bro[i])dp(i); for(int j=1;j<=n;j++){ f[nd][j]=(j%2)*w[nd]-j*p[nd]; for(int i=son[nd];i;i=bro[i])f[nd][j]+=mx[i][j]; mx[nd][j]=max(mx[nd][j-1],f[nd][j]); } } signed main(){ // freopen("color.in","r",stdin); // freopen("color.out","w",stdout); int T;cin>>T; while(T--){ init(); mx[s][0]=-inf; if(!deg[s]){ dp(s); printf("%lld\n",mx[s][2]+p[s]); continue; } for(int i=0;i<cnt;i++)dp(rt[i]); if(cnt==2){ int x=rt[0],y=rt[1]; int ans=f[x][1]+f[y][0]+p[x]; ans=max(ans,f[x][1]+f[y][1]+p[x]); ans=max(ans,f[x][2]+f[y][0]+p[x]); printf("%lld\n",ans); continue; } else cout<<-1<<endl; } return 0; }