显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,dp[210000][2],f[210000][2],c[210000];
bool vis[210000],now[210000];
vector<ll> out[210000],ring;
ll in[210000],ans;
void dfs(ll u){
vis[u]=1;
dp[u][0]=(u!=in[u])*c[u];
for(ll v:out[u]){
if(!now[v]&&!vis[v])
dfs(v),dp[u][0]+=min(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0];
}
}
ll solve(ll x){
ring.clear();
ll y=x;
do{
ring.push_back(y);
now[y]=1,y=in[y];
}while(y!=x);
for(ll u:ring) dfs(u);
ll len=ring.size();
if(len==1) return min(dp[ring[0]][0],dp[ring[0]][1]);
for(int i=0;i<len;i++) f[i][0]=f[i][1]=1e18;
f[0][0]=dp[ring[0]][0];
for(int i=1;i<len;i++){
f[i][0]=min(f[i][0],min(f[i-1][0],f[i-1][1])+dp[ring[i]][0]),
f[i][1]=min(f[i][1],f[i-1][0]+dp[ring[i]][1]);
}
ll res=min(f[len-1][0],f[len-1][1]);
for(ll i=0;i<len;i++) f[i][0]=f[i][1]=1e18;
f[0][0]=dp[ring[0]][0];f[0][1]=dp[ring[0]][1];
for(int i=1;i<len;i++){
f[i][0]=min(f[i][0],min(f[i-1][0],f[i-1][1])+dp[ring[i]][0]);
f[i][1]=min(f[i][1],f[i-1][0]+dp[ring[i]][1]);
}
res=min(res,f[len-1][0]);
return res;
}
int main(){
// freopen("in.in","r",stdin);
freopen("Function.in","r",stdin);
freopen("Function.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&in[i]),out[in[i]].push_back(i);
for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
for(int i=1;i<=n;i++){
if(!vis[i]){
ll x=in[i],y=i;
while(x!=y) x=in[in[x]],y=in[y];
ll tmp=solve(x);
ans+=tmp;
}
}
printf("%lld",ans);
}