luogu 第一篇题解
#include<bits/stdc++.h>
#define N 1000050
#define LL long long
#define inf 1000000000000000
using namespace std;
int to[N],n,a[N],b[N],w[N],vis[N];
LL ans,cnt,Sum,Min,tot_Min=inf,val[N];
void dfs(int u){
vis[u] = 1; Sum += val[a[u]]; cnt++;
Min = min(Min,val[a[u]]);
if(!vis[to[u]]) dfs(to[u]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
tot_Min = min(tot_Min,val[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&a[i]); b[a[i]]=i;
} for(int i=1;i<=n;i++){
int x; scanf("%d",&x);
if(b[x]!=i) to[i] = b[x];
} for(int i=1;i<=n;i++) if(!vis[i]&&to[i]){
Sum = cnt = 0; Min = inf; dfs(i);
LL tmp1 = Sum + Min * (cnt-2);
LL tmp2 = 2 * (tot_Min + Min) + (Sum-Min+tot_Min) + tot_Min * (cnt-2);
ans += min(tmp1,tmp2);
} printf("%lld",ans); return 0;
}