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.util.Scanner;

/**
 * Created by zhangrunfeng on 2/22/20
 */
public class Main {

    private int N;
    private int[][] G;
    private final int MAX = Integer.MAX_VALUE;

    private boolean[] visit;
    public int[] d;

    public Main(Scanner sc) {
        N = sc.nextInt();
        G = new int[N][];
        for (int i = 0; i < N; i++) {
            G[i] = new int[N];
            for (int j = 0; j < N; j++) {
                int e = sc.nextInt();
                if (e == -1) {
                    e = MAX;
                }
                G[i][j] = e;
            }
        }

        visit = new boolean[N];
        d = new int[N];
        for (int i = 0; i < N; i++) {
            d[i] = MAX;
        }
    }

    public int prim() {
        for (int i = 0; i < N; i++) {
            d[i] = MAX;
        }
        d[0] = 0;

        int ans = 0;
        while(true) {
            // 找到下一个放入的结点
            int nextNode = -1;
            for (int i = 0; i < N; i++) {
                if (!visit[i] && (nextNode == -1 || d[i] < d[nextNode])) {
                    nextNode = i;
                }
            }

            if (nextNode == -1) break;

            ans += d[nextNode];
            visit[nextNode] = true;
            // 更新数组d
            for (int i = 0; i < N; i++) {
                d[i] = Math.min(d[i], G[i][nextNode]);
            }
        }
        return ans;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Main m = new Main(sc);
        int res = m.prim();
        System.out.println(res);
    }
}