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);
}

沒有留言:

張貼留言