Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Minimum Cost Sort

You are given $n$ integers $w_i (i = 0, 1, ..., n-1)$ to be sorted in ascending order. You can swap two integers $w_i$ and $w_j$. Each swap operation has a cost, which is the sum of the two integers $w_i + w_j$. You can perform the operations any number of times.

Write a program which reports the minimal total cost to sort the given integers.

Input

In the first line, an integer $n$ is given. In the second line, $n$ integers $w_i (i = 0, 1, 2, ... n-1)$ separated by space characters are given.

Output

Print the minimal cost in a line.

Constraints

$1 \leq n \leq 1,000$

$0 \leq w_i\leq 10^4$

$w_i$ are all different

Sample Input 1

5
1 5 3 4 2

Sample Output 1

7

Sample Input 2

4
4 3 2 1

Sample Output 2

10

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

class Main{
    public static void main(String[] args) throws IOException{
        final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        final int n = Integer.parseInt(br.readLine());
        final Bug[] A = new Bug[n];
        final boolean[] found = new boolean[n];
        final StringTokenizer in = new StringTokenizer(br.readLine(), " ");
        for(int i = 0; i<n; i++)
            A[i] = new Bug(Integer.parseInt(in.nextToken()), i);
        Arrays.sort(A);
        int cost = 0;
        final int min = A[0].weight;
        for(int i = 0; i<n; i++){
            if(found[i]) continue;
            found[i] = true;
            int m = 0;
            for(int j = A[i].index; j!=i; j = A[j].index){
                found[j] = true;
                cost += A[j].weight;
                m++;
            }
            cost += Math.min(A[i].weight*m, min*(m+2)+A[i].weight*2);
        }
        System.out.println(cost);
    }
}

class Bug implements Comparable<Bug>{
    final int weight;
    final int index;
    Bug(int weight, int index){
        this.weight = weight;
        this.index = index;
    }
    @Override
    public int compareTo(Bug o){
        if(weight<o.weight) return -1;
        else if(weight>o.weight) return 1;
        else return 0;
    }
}