2013年12月3日 星期二
[HOJ] 21 - 大象
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
struct P{
int x,y;
};
vector<P> vec;
int visit[1000005]={0};
int s[1000005],a[1000005],b[1000005],c[1000005],siz;
long long int add,mi;
void dfs(int v){
siz++;
add+=s[v];
if(s[v]<mi) mi=s[v];
if(visit[c[v]]==0){
visit[c[v]]=1;
dfs(c[v]);
}
}
int main(){
int n,i,x,y=-1;
long long int ans=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=0;i<n;i++)
c[a[i]]=b[i];
for(i=1;i<=n;i++){
if(visit[i]==0){
siz=0,add=0,mi=99999999;
visit[i]=1;
dfs(i);
ans+=add+mi*(siz-2);
if(y==-1 || mi<y) y=mi;
vec.push_back((P){mi,siz});
}
}
for(i=0;i<vec.size();i++){
if(vec[i].x*vec[i].y-3*vec[i].x-y-y*vec[i].y>0)
ans-=vec[i].x*vec[i].y-3*vec[i].x-y-y*vec[i].y;
}
printf("%lld\n",ans);
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言