题目:http://poj.org/problem?id=3270
题解:黑书P248
代码:
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef struct
{
int num,value;
}p;
p a[100005];
int n;
int b[100005],x,j,flag;
int v[100005],sum,min1;
__int64 ans;
bool cmp(p s,p t)
{
return s.value<t.value;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].value);
a[i].num=i;
v[i]=0;
b[i]=a[i].value;
}
sort(a,a+n,cmp);
flag=1;
ans=0;
for(int i=0;i<n;i++)
{
flag=0;
if(v[i]==0)
{
x=1;
flag=1;
v[i]=1;
j=i;
min1=b[i];
sum=b[i];
while(b[i]!=a[j].value)
{
j=a[j].num;
if(b[j]<min1) min1=b[j];
sum=sum+b[j];
v[j]=1;
x++;
}
}
// printf("sum=%d min1=%d x=%d\n",sum,min1,x);
if(flag==1&&x!=1)
ans+=sum+((x-2)*min1>min1+(x+1)*a[0].value?min1+(x+1)*a[0].value:(x-2)*min1);
}
printf("%I64d\n",ans);
return 0;
}