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 C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _20180307_AOJ
{
    class ALDS1_6D
    {
        static void Main(string[] args)
        {
            for (;;)
            {
                string line = Console.ReadLine();
                if (string.IsNullOrEmpty(line))
                {
                    break;
                }

                int n = int.Parse(line);
                int[] arr = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
                int[] sorted = new int[n];
                arr.CopyTo(sorted, 0);
                Array.Sort(sorted);
                Dictionary<int, int> dict = new Dictionary<int, int>();
                for(int i=0;i<n;i++)
                {
                    dict.Add(sorted[i], arr[i]);
                }

                List<List<int>> cyclics = new List<List<int>>();
                while(dict.Count>0)
                {
                    List<int> list = new List<int>();
                    var kvp = dict.FirstOrDefault();
                    while(dict.ContainsKey(kvp.Key))
                    {
                        list.Add(kvp.Key);
                        dict.Remove(kvp.Key);
                        kvp = dict.FirstOrDefault(x=>x.Key == kvp.Value);
                    }

                    cyclics.Add(list);
                }

                int min = arr.Min();
                long sum = 0;
                foreach(var v in cyclics)
                {
                    long sum1 = SingleSum(v);
                    long sum2 = SumWithX(v, min);
                    sum += Math.Min(sum1, sum2);
                }

                Console.WriteLine(sum);
            }
        }

        static long SingleSum(List<int> list)
        {
            int min = list.Min();
            int len = list.Count;
            long sum = (len - 2) * min + list.Sum();
            return sum;
        }

        static long SumWithX(List<int> list, int x)
        {
            int min = x;
            int len = list.Count;
            long sum = len * min + list.Sum() + list.Min();
            return sum;
        }
    }
}