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: Accepted)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		int N = int.Parse(Console.ReadLine());
		int[,]A = new int[N,2];
		int[][]B = new int[N*2][];
		for(var i=0;i<N;i++){
			string[] str = Console.ReadLine().Split();
			A[i,0] = int.Parse(str[0]);
			A[i,1] = int.Parse(str[1]);
			B[i*2] = new int[3];
			B[i*2][0] = A[i,0];
			B[i*2][1] = i;
			B[i*2][2] = 0;
			B[i*2+1] = new int[3];
			B[i*2+1][0] = A[i,1];
			B[i*2+1][1] = i;
			B[i*2+1][2] = 1;
		}
		Array.Sort(B, (x,y) => x[0] - y[0]);
		int[,]C = new int[N,2];
		int cta = 0;
		int ctb = 0;
		long ct = 0;
		for(var i=0;i<N;i++){
			ct += B[i][0];
			C[B[i][1],B[i][2]] += 1;
			if(B[i][2] == 0){
				cta += 1;
			} else {
				ctb += 1;
			}
		}
		if(cta < N && ctb < N){
			int fct = 0;
			for(var i=0;i<N;i++){
				if(C[i,0] == 1 && C[i,1] == 1){
					fct += 1;
				}
			}
			if(fct == 0){
				ct -= B[N-1][0];
				ct += B[N][0];
				if(B[N-1][1] == B[N][1]){
					long ct1 = ct;
					ct1 -= B[N][0];
					ct1 += B[N+1][0];
					long ct2 = ct;
					ct2 -= B[N-2][0];
					ct2 += B[N-1][0];
					ct = Math.Min(ct1,ct2);
				}
			}
		}
		Console.WriteLine(ct);
	}
}