D题
#include <bits/stdc++.h>
using namespace std;
int c[222000];
int a[222000];
int vis[222000];
int temp;
int sk[202000];
int top;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",c+i);
}
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
int ans=0;
int color=1;
for(int i=1;i<=n;i++){
if(!vis[i]){
int cur=i;
while(!vis[cur]){
vis[cur]=color;
cur=a[cur];
}
if(vis[cur]==color){//如果在同一个颜色里 暴力查找环中最小值
int nxt=a[cur];
int Min=c[cur];
while(nxt!=cur){
Min=min(Min,c[nxt]);
nxt=a[nxt];
}
ans+=Min;
}
//如果不同则不用管他 因为之前已经把老鼠夹放到另一个颜色中了
}
++color;
}
cout<<ans<<endl;
return 0;
}