分析:
虽然题目给出了初始序列和目标序列
如果我们按照初始序列排序,就可以将题目转化成poj3270
tip
开ll
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int INF=1e9;
const int N=1000010;
int n,W[N],belong[N],minn;
struct node{
int x,y;
};
node a[N];
int cmp(const node &a,const node &b)
{
return a.x<b.x;
}
int main()
{
scanf("%d",&n);
minn=INF;
for (int i=1;i<=n;i++) scanf("%d",&W[i]),minn=min(minn,W[i]);
for (int i=1;i<=n;i++) scanf("%d",&a[i].x);
for (int i=1;i<=n;i++) scanf("%d",&a[i].y);
sort(a+1,a+1+n,cmp);
ll ans=0;
for (int i=1;i<=n;i++) if (!belong[i])
{
int size=0,mn=INF,x=i;
ll sum=0;
do
{
size++; mn=min(mn,W[x]); sum+=(ll)W[x];
belong[x]=1; x=a[x].y;
}
while (x!=i);
if (size>1) ans=ans+min((ll)sum+(size-2)*mn,(ll)sum+mn+(size+1)*minn);
}
printf("%lld",ans);
return 0;
}