传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1119
置换群裸题不解释
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n;
int a[maxn],b[maxn],c[maxn];
int w[maxn];
bool vis[maxn];
typedef long long LL;
LL ans=0,minz;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",w+i);
minz=*min_element(w+1,w+1+n);
for(int i=1;i<=n;i++)scanf("%d",a+i);
for(int i=1;i<=n;i++)scanf("%d",b+i);
for(int i=1;i<=n;i++)c[a[i]]=b[i];
for(int i=1;i<=n;i++){
int x=c[i];
if(vis[x])continue;
LL sum=0,minn=1LL<<61,size=0;
while(!vis[x]){
vis[x]=1;
minn=min(minn,(LL)w[x]);
sum+=w[x];
size++;
x=c[x];
}
ans+=min((minz+minn)*2+(sum-minn)+minz*(size-1),
(sum-minn)+minn*(size-1));
}
cout<<ans<<endl;
return 0;
}