Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34266 | swzzzz | 【S】T4 | C++ | 解答错误 | 10 | 70 MS | 664 KB | 1897 | 2024-11-04 11:14:45 |
#include<bits/stdc++.h> using namespace std; #define N 5005 #define ll long long int t; int n,s; int w[N],p[N],a[N]; vector<int>son[N]; bool vis[N],in_ring[N]; vector<int>ring; ll f[N]; void find(){ memset(vis,0,sizeof(vis)); memset(in_ring,0,sizeof(in_ring)); ring.clear(); int node=a[s]; while (!vis[node]) { vis[node]=1; node=a[node]; } int i=a[node]; ring.push_back(node); in_ring[node]=1; while (i!=node) { in_ring[i]=1; ring.push_back(i); i=a[i]; } } void dp(int x){ if(x==s || in_ring[x]) f[x]=0; else f[x]=w[x]-p[x]; for(int i:son[x]){ if(!in_ring[i]){ dp(i); f[x]+=f[i]; } } f[x]=max(f[x],(ll)0); } int main(){ //freopen("color3.in","r",stdin); //freopen("color3.out","w",stdout); cin>>t; while (t--) { memset(f,0,sizeof(f)); scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) son[i].clear(); for(int i=1;i<=n;i++) scanf("%d",&w[i]); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); son[a[i]].push_back(i); } find(); if(!in_ring[s]) { dp(s); cout<<f[s]+w[s]; } else { ll tmp=0; ll ans=0; for(int i:ring){ dp(i); } //cout<<endl; tmp=f[s]+w[s]; ans=tmp; for(int i=ring.size()-2;i>=0;i--){ //cout<<ring[i+1]<<' '<<tmp<<endl; tmp+=f[ring[i]]+w[ring[i]]-p[ring[i]]; ans=max(ans,tmp); } //cout<<endl; cout<<ans; } cout<<endl; } return 0; }