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: Wrong Answer)

// https://atcoder.jp/contests/agc028/tasks/agc028_c
//
#![allow(unused_imports)]
use std::cmp::*;
use std::collections::*;
use std::fmt::*;
use std::io::*;
use std::str::*;

macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let 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")
    };
}

#[allow(unused_macros)]
macro_rules! debug {
    ($($a:expr),*) => {
        println!(concat!($(stringify!($a), " = {:?}, "),*), $($a),*);
    }
}

fn solve(v: Vec<(u64, u64)>) -> u64 {
    let mut left = vec![];
    let mut right = vec![];
    for vi in v {
        if vi.0 <= vi.1 {
            left.push(vi);
        } else {
            right.push(vi);
        }
    }
    //println!("{:?} {:?}", left, right);

    let mut total = 0;
    for l in left.iter() {
        total += l.0;
    }
    for r in right.iter() {
        total += r.1;
    }

    if left.len() == 0 || right.len() == 0 {
        return total;
    }
    if left.len() == 1 && right.len() == 1 {
        let l = left[0];
        let r = right[0];
        return min(l.0, r.1) + min(l.1, r.0);
    }

    let mut left_left: Vec<(usize, (u64, u64))> = (0..).zip(left).collect();
    let mut right_right: Vec<(usize, (u64, u64))> = (0..).zip(right).collect();
    let mut left_right = left_left.clone();
    let mut right_left = right_right.clone();

    left_left.sort_by_key(|a| (a.1).0);
    left_right.sort_by_key(|a| (a.1).1);

    right_left.sort_by_key(|a| (a.1).0);
    right_right.sort_by_key(|a| (a.1).1);

    let ln = left_left.len();
    let rn = right_right.len();

    let mut ret = 1e18 as u64;

    for ll in left_left.iter() {
        let lidx = ll.0;
        let ain = (ll.1).0;

        for sel in 0..min(2, rn) {
            let rr = right_right[rn - 1 - sel];
            let ridx = rr.0;
            let aout = (rr.1).1;

            let lr_rl = (
                left_right.iter().find(|lr| lr.0 != lidx),
                right_left.iter().find(|rl| rl.0 != ridx),
            );
            if let (Some(lr), Some(rl)) = lr_rl {
                ret = min(
                    ret,
                    total + min(ain, aout) + min((lr.1).1, (rl.1).0) - ain - aout,
                );
            } else if let (Some(lr), None) = lr_rl {
                ret = min(
                    ret,
                    total + min(ain, aout) + min((lr.1).1, (rr.1).0) - ain - aout,
                );
            }
        }
    }

    for rr in right_right.iter() {
        let ridx = rr.0;
        let aout = (rr.1).1;

        for sel in 0..min(2, ln) {
            let ll = left_left[ln - 1 - sel];
            let lidx = ll.0;
            let ain = (ll.1).0;

            let lr_rl = (
                left_right.iter().find(|lr| lr.0 != lidx),
                right_left.iter().find(|rl| rl.0 != ridx),
            );
            if let (Some(lr), Some(rl)) = lr_rl {
                ret = min(
                    ret,
                    total + min(ain, aout) + min((lr.1).1, (rl.1).0) - ain - aout,
                );
            } else if let (None, Some(rl)) = lr_rl {
                ret = min(
                    ret,
                    total + min(ain, aout) + min((ll.1).1, (rl.1).0) - ain - aout,
                );
            }
        }
    }
    ret
}

fn main() {
    input! {
        n: usize,
        v: [(u64, u64); n]
    };

    let ans = solve(v);
    println!("{}", ans);
}