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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)



import java.util.Comparator;
import java.util.HashSet;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static class Node implements Comparable<Node> {
        public long value;
        public int index;

        public Node(final long value, final int index) {
            this.value = value;
            this.index = index;
        }


        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Node node = (Node) o;
            return value == node.value &&
                    index == node.index;
        }

        @Override
        public int hashCode() {
            return Objects.hash(value, index);
        }

        @Override
        public int compareTo(Node o) {
            if (this.value < o.value) {
                return -1;
            } else if (this.value == o.value) {
                return 0;
            } else {
                return 1;
            }

        }
    }
    public static void main(String [] args) {
        final Scanner scanner = new Scanner(System.in);
        final int n = scanner.nextInt();
        final PriorityQueue<Node> a = new PriorityQueue<>(
        );
        final PriorityQueue<Node> b = new PriorityQueue<>(
                Comparator.reverseOrder()
        );
        final Set<Integer> visited = new HashSet<>();

        for (int i = 1; i <= n; ++i) {
            long currentA = scanner.nextLong();
            long currentB = scanner.nextLong();
            a.add(new Node(currentA, i));
            b.add(new Node(currentB, i));
        }
        long result = 0;

        while (!a.isEmpty()) {
            Node aNode = a.poll();
            Node bNode = b.poll();
            Set<Node> bNodes = new HashSet<>();
            while (aNode.index == bNode.index || ((!b.isEmpty()) && visited.contains(bNode.index))) {
                bNodes.add(bNode);
                bNode = b.poll();
            }
            result += Math.min(aNode.value, bNode.value);
            visited.add(bNode.index);
            b.addAll(bNodes);
        }
        System.out.println(result);
    }
}