显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,a[N],c[N],mk[N],vis[N],pos;
vector<int>G[N];
long long dp[N][2],res,ans;
void dfs(int x,int fa){
//cout<<x<<" "<<fa<<endl;
//system("pause");
mk[x]=1;
dp[x][0]=0;
dp[x][1]=(x==a[x])?0:c[x];
for(auto y:G[x]){
//cout<<x<<"->"<<y<<endl;
if(y==fa||pos==y)continue;
dfs(y,x);
dp[x][1]+=min(dp[y][0],dp[y][1]);
dp[x][0]+=dp[y][1];
}
return;
}
int main(){
freopen("Function.in","r",stdin);
freopen("Function.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",a+i);
for(int i=1;i<=n;i++)scanf("%d",c+i);
for(int i=1;i<=n;i++){
G[a[i]].push_back(i);
}
for(int i=1;i<=n;i++){
if(!mk[i]){
int x=i;
while(!vis[x])vis[x]=1,x=a[x];//cout<<x<<endl;
pos=x;dfs(x,0);res=dp[x][1];//cout<<dp[x][1]<<endl;
pos=a[x];dfs(a[x],0),res=min(res,dp[a[x]][1]);//cout<<dp[a[x]][1]<<endl;
ans+=res;
}
}
printf("%lld\n",ans);
return 0;
}