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: Runtime Error)

using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
class Program
{
	static void Main()
	{
		long n = long.Parse(Console.ReadLine());//int.Parseは文字列を整数に変換。
    long[][] vertexesX = new long[n][];//数、番号、使ったら1
    long[][] vertexesY = new long[n][];
    long minNumX = 0;
    long minNumY = 0;
    long maxNumX = n-1;
    long maxNumY = n-1;
    long answer = 0;
    for(long i = 0; i < n; i++)
    {
      long[] nums = Array.ConvertAll(Console.ReadLine().Split(' '),long.Parse);
      vertexesX[i] = new long[3];
      vertexesY[i] = new long[3];
      vertexesX[i][0] = nums[0];
      vertexesX[i][1] = i;
      vertexesX[i][2] = 0;
      vertexesY[i][0] = nums[1];
      vertexesY[i][1] = i;
      vertexesY[i][2] = 0;
    }

    Array.Sort(vertexesX, (a, b) => a[0].CompareTo(b[0]));
    Array.Sort(vertexesY, (a, b) => a[0].CompareTo(b[0]));//ソート

    for(long i = 0; i < n; i++)
    {
      while(true)
      {
        if(vertexesX[minNumX][2] == 1) minNumX++;
        if(vertexesY[minNumY][2] == 1) minNumY++;
        if(vertexesX[minNumX][2] == 0 && vertexesY[minNumY][2] == 0) break;
      }
      if(vertexesX[minNumX][0] < vertexesY[minNumY][0])//最小がx側
      {
        //Console.WriteLine("b");
        answer += vertexesX[minNumX][0];
        minNumX++;
        if(vertexesY[maxNumY][1] != vertexesX[minNumX][1])//番号が異なる
        {
          vertexesY[maxNumY][2] = 1;
          maxNumY--;
          if(vertexesY[maxNumY][2] == 1) maxNumY--;
        }else//同じ番号
        {
        //Console.WriteLine("a");
          vertexesY[maxNumY-1][2] = 1;
        }
      }else
      {
        answer += vertexesY[minNumY][0];
        minNumY++;
        if(vertexesX[maxNumX][1] != vertexesY[minNumY][1])//番号が異なる
        {
          vertexesX[maxNumX][2] = 1;
          maxNumX--;
          if(vertexesX[maxNumX][2] == 1) maxNumX--;
        }else//同じ番号
        {
          vertexesX[maxNumX-1][2] = 1;
        }
      }
    }
    
		Console.WriteLine(answer);
	}
}