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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
template<class T = int> using V = vector<T>;
template<class T = int> using VV = V< V<T> >;
template<class T> void assign(V<T>& v, int n, const T& a = T()) { v.assign(n, a); }
template<class T, class... Args> void assign(V<T>& v, int n, const Args&... args) { v.resize(n); for (auto&& e : v) assign(e, args...); }


int main() {
  cin.tie(nullptr); ios_base::sync_with_stdio(false);
  int n; cin >> n;
  V<> a(n), b(n); for (int i = 0; i < n; ++i) cin >> a[i] >> b[i];
  V<> id(2 * n); iota(begin(id), end(id), 0);
  sort(begin(id), end(id), [&](int i, int j) { return (i < n ? a[i] : b[i - n]) < (j < n ? a[j] : b[j - n]); });
  V<> c(2 * n);
  for (int i = 0; i < n; ++i) ++c[id[i]];
  int s = accumulate(begin(c), next(begin(c), n), 0);
  bool ok = false;
  for (int i = 0; i < n; ++i) if (c[i] and c[i + n]) ok = true;
  lint res = 0;
  for (int i = 0; i < n; ++i) res += id[i] < n ? a[id[i]] : b[id[i] - n];
  if (s != 0 and s != n and !ok) {
    if (id[n] < n) {
      res += a[id[n]];
      for (int i = n - 1; i >= 0; --i) if (id[i] != id[n] + n) {
        res -= id[i] < n ? a[id[i]] : b[id[i] - n];
        break;
      }
    } else {
      res += b[id[n] - n];
      for (int i = n - 1; i >= 0; --i) if (id[i] != id[n] - n) {
        res -= id[i] < n ? a[id[i]] : b[id[i] - n];
        break;
      }
    }
  }
  cout << res << '\n';
}