Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Minimum Spanning Tree

For a given weighted graph $G = (V, E)$, find the minimum spanning tree (MST) of $G$ and print total weight of edges belong to the MST.

Input

In the first line, an integer $n$ denoting the number of vertices in $G$ is given. In the following $n$ lines, a $n \times n$ adjacency matrix $A$ which represents $G$ is given.
$a_{ij}$ denotes the weight of edge connecting vertex $i$ and vertex $j$. If there is no edge between $i$ and $j$, $a_{ij}$ is given by -1.

Output

Print the total weight of the minimum spanning tree of $G$.

Constraints

$1 \leq n \leq 100$

$0 \leq a_{ij} \leq 2,000$ (if $a_{ij} \neq -1$)

$a_{ij} = a_{ji}$

$G$ is a connected graph

Sample Input 1

5
-1 2 3 1 -1
2 -1 -1 4 -1
3 -1 -1 1 1
1 4 1 -1 3
-1 -1 1 3 -1

Sample Output 1

5

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

Solution in JAVA (judge verdict: Accepted)

import java.io.IOException;
import java.util.Scanner;

public class Main {
	static int time = 0;

	public static void main(String[] args) throws IOException {

		Scanner scan = new Scanner(System.in);
		// Scanner scan = new Scanner(new
		// File("D:\\UserArea\\J0124567\\Downloads\\ALDS1_6_A-in9.txt"));

		int n = scan.nextInt();
		MSTree mst = new MSTree(n);

		for (int y = 0; y < n; y++)
			for (int x = 0; x < n; x++)
				mst.setLeng(x, y, scan.nextInt());

		System.out.println(mst.getMinTree());

		scan.close();
		System.exit(0);
	}
}

class MSTree {
	int[][] leng;
	int[] reach;

	public MSTree(int n) {
		leng = new int[n][n];
		reach = new int[n];
		for (int i = 0; i < n; i++)
			reach[i] = -1;
	}

	public int getMinTree() {
		int min = Integer.MAX_VALUE;
		int xx = 0, yy = 0;
		for (int x = 0; x < leng.length; x++)
			for (int y = x + 1; y < leng[x].length; y++)
				if (leng[x][y] !=-1 && leng[x][y] < min) {
					xx = x;
					yy = y;
					min = leng[x][y];
				}
		reach[xx] = 0;
		reach[yy] = min;
		for (int i = 2; i < reach.length; i++)
			nextMin();

		int total = 0;
		for (int i = 0; i < reach.length; i++)
			total += reach[i];
		return total;
	}

	private void nextMin() {
		int min = Integer.MAX_VALUE;
		int xx = 0, yy = 0;
		for (int x = 0; x < leng.length; x++) {
			if (reach[x] == -1)
				continue;
			for (int y = 0; y < leng[x].length; y++) {
				if (reach[y] != -1||leng[x][y]==-1)
					continue;
				if (leng[x][y] < min) {
					xx = x;
					yy = y;
					min = leng[x][y];
				}
			}
		}
		reach[yy] = min;
	}

	public void setLeng(int x, int y, int length) {
		leng[x][y] = length;
	}

}