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 Rust (1.15.1) (judge verdict: Accepted)

/// Thank you tanakh!!!
/// https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8
macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let mut s = {
            use std::io::Read;
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};

    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };

    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };

    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };

    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };

    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

use std::cmp;
use std::collections::BinaryHeap;

fn solve(ab: &Vec<(usize, usize)>) -> usize {
    let n = ab.len();
    let mut v = vec![];
    for (i, &(a, b)) in ab.iter().enumerate() {
        v.push((a, i));
        v.push((b, i));
    }
    v.sort();

    let mut used_count = vec![0; n];
    let mut ans = 0;
    for i in 0..n {
        let (x, i) = v[i];
        used_count[i] += 1;
        ans += x;
    }

    for i in 0..n {
        if used_count[i] == 2 {
            return ans;
        }
    }

    let mut min = 1e15 as usize;

    for i in 0..n {
        assert_eq!(used_count[i], 1);
        let (a, b) = ab[i];
        let ans = ans - cmp::min(a, b);
        let (w, j) = v[n];
        if j == i {
            let (w, _) = v[n + 1];
            min = cmp::min(min, ans + w);
        } else {
            min = cmp::min(min, ans + w);
        }
    }
    min
}

fn main() {
    input!(n: usize, ab: [(usize, usize); n]);

    let ans0: usize = ab.iter().map(|&(a, _)| a).sum();
    let ans1: usize = ab.iter().map(|&(_, b)| b).sum();
    let ans2 = solve(&ab);
    println!("{}", cmp::min(cmp::min(ans0, ans1), ans2));
}