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;

public class CSharp{
    public static void Main(){
        Kyopuro chokudai = new Kyopuro();
	    chokudai.AtCoder();
	}
}

public class Kyopuro{
    public void AtCoder(){
        int n = int.Parse(Console.ReadLine());
        int[] a = new int[n];
        int[] b = new int[n];
        int[] c = new int[n * 2];
        string[] s;
        for(int i=0; i<n; i++){
            s = Console.ReadLine().Split(' ');
            a[i] = int.Parse(s[0]);
            b[i] = int.Parse(s[1]);
            c[i] = a[i];
            c[n + i] = b[i];
        }
		Array.Sort(c);
		var d = new Dictionary<int, int>();
		for(int i=0; i<n; i++){
		    if(d.ContainsKey(c[i])){
		        d[c[i]]++;
		    } else {
		        d.Add(c[i], 1);
		    }
		}
		bool f = false;
		for(int i=0; i<n; i++){
		    if(d.ContainsKey(a[i]) && d.ContainsKey(b[i])){
		        if(a[i] == b[i]){
    		        if(d[a[i]] > 1) f = true;
    		    } else {
    		        if(d[a[i]] > 0 && d[b[i]] > 0) f = true;
    		    }
		    }
		}
		int g = 0;
		int h = 0;
		if(!f){
		    for(int i=0; i<n; i++){
		        if(a[i] < b[i]) h++;
		        if(a[i] > b[i]) g++;
		    }
		    if(g == 0 || h == 0) f = true;
		}
		long ans = 0;
		for(int i=0; i<n; i++) ans += c[i];
		if(f) Console.WriteLine(ans);
		else{
		    if(n > 2){
		        int x = 0;
		        int y = 0;
		        int z = 0;
		        int u = -1;
		        for(int i=0; i<n; i++){
		            x = Math.Min(a[i], b[i]);
		            y = Math.Max(a[i], b[i]);
		            if(x == c[n-1] && y == c[n]){
		                f = true;
		                z++;
		                u = i;
		            }
		        }
		        if(z == 1){
		            if(a[u] < b[u] && h > 1){
		                f = true;
	                }
	                if(a[u] > b[u] && g > 1){
	                    f = true;
	                }
	                if(a[u] == b[u]){
	                    f = true;
	                }
	                if(f) ans = Math.Min(ans - c[n-1] + c[n+1], ans - c[n-2] + c[n]);
		        }
		    }
		    if(!f) ans = ans - c[n-1] + c[n];
		    Console.WriteLine(ans);
		}
    }
    
    public static void DebugWL(object x){ System.Diagnostics.Debug.WriteLine(x); }
}