Problem:
Score : 700 points

Problem Statement

We have a directed weighted graph with N vertices.
Each vertex has two integers written on it, and the integers written on Vertex i are A_i and B_i.

In this graph, there is an edge from Vertex x to Vertex y for all pairs 1 \leq x,y \leq N, and its weight is {\rm min}(A_x,B_y).

We will consider a directed cycle in this graph that visits every vertex exactly once.
Find the minimum total weight of the edges in such a cycle.

Constraints

2 \leq N \leq 10^5

1 \leq A_i \leq 10^9

1 \leq B_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 B_1
A_2 B_2
:
A_N B_N

Output

Print the minimum total weight of the edges in such a cycle.

Sample Input 1

3
1 5
4 2
6 3

Sample Output 1

7

Consider the cycle 1→3→2→1. The weights of those edges are {\rm min}(A_1,B_3)=1, {\rm min}(A_3,B_2)=2 and {\rm min}(A_2,B_1)=4, for a total of 7.
As there is no cycle with a total weight of less than 7, the answer is 7.

Sample Input 2

4
1 5
2 6
3 7
4 8

Sample Output 2

10

Sample Input 3

6
19 92
64 64
78 48
57 33
73 6
95 73

Sample Output 3

227

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Competitive
{
    internal class Solution
    {
        public int N;
        public long[] A, B;
        public long MOD = 1000000007;

        public void Run()
        {
            N = Input.ReadInt();
            A = new long[N];
            B = new long[N];
            for (int i = 0; i < N; i++)
            {
                var line = Input.ReadLongArray();
                A[i] = line[0];
                B[i] = line[1];
            }

            // ABを合わせてソート
            var ab = new long[2 * N];
            for (int i = 0; i < N; i++)
            {
                ab[i] = A[i];
                ab[N + i] = B[i];
            }
            Array.Sort(ab);

            // 使いたい最後の値
            var last = ab[N - 1];

            int both = 0;
            int a = 0;
            int b = 0;
            List<long> AA = new List<long>();
            List<long> BB = new List<long>();
            List<long> AAE = new List<long>();
            List<long> BBE = new List<long>();

            for (int i = 0; i < N; i++)
            {
                if (A[i] == last && B[i] == last)
                {
                    a++;
                }
                else if (A[i] <= last && B[i] <= last)
                {
                    both++;
                }
                else if (A[i] <= last)
                    a++;
                else if (B[i] <= last)
                    b++;

                // listに追加
                if (A[i] <= last)
                {
                    AA.Add(A[i]);
                }
                else
                {
                    AAE.Add(A[i]);
                }

                if (B[i] <= last)
                {
                    BB.Add(B[i]);
                }
                else
                {
                    BBE.Add(B[i]);
                }

            }

            AA.Sort();
            AAE.Sort();
            BB.Sort();
            BBE.Sort();

            // 小さいN個に偏りがあればOK
            // タイがある場合もOKか??
            if (both > 0 || a >= N || b >= N)
            {
                long ret = 0;
                for (int i = 0; i < N; i++)
                {
                    ret += (long)ab[i];
                }
                Console.WriteLine(ret);
                return;
            }

            // ダメな場合は、Aの次に大きい値と、Bの次に大きい値をとる
            {
                long ret = 0;
                for (int i = 0; i < N; i++)
                {
                    ret += (long)ab[i];
                }
                long ret1 = ret - AA.Last() + BBE.First();
                long ret2 = ret - BB.Last() + AAE.First();
                Console.WriteLine(Math.Min(ret1, ret2));
                return;
            }
        }
    }

    // libs ----------
    

    // common ----------

    internal static class Input
    {
        public static string ReadString()
        {
            string line = Console.ReadLine();
            return line;
        }

        public static int ReadInt()
        {
            string line = Console.ReadLine();
            return int.Parse(line);
        }

        public static int[] ReadIntArray()
        {
            string line = Console.ReadLine();
            return line.Split(' ').Select(int.Parse).ToArray();            
        }

        public static long ReadLong()
        {
            string line = Console.ReadLine();
            return long.Parse(line);
        }

        public static long[] ReadLongArray()
        {
            string line = Console.ReadLine();
            return line.Split(' ').Select(long.Parse).ToArray();
        }

        public static double[] ReadDoubleArray()
        {
            string line = Console.ReadLine();
            return line.Split(' ').Select(double.Parse).ToArray();
        }
    }
    
    internal class Program
    {
        public static void Main(string[] args)
        {
            var s = new Solution();
            s.Run();
        }
    }
}