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 Scala (judge verdict: Accepted)

import scala.io.StdIn.{readInt, readLine};
import scala.collection.mutable.PriorityQueue;

object Main {
    def main(args: Array[String]): Unit = {
        val size = readInt;
        val graph = new Array[List[(Int, Int)]](size); // (cost, index)
        for (i <- (0 until size)) {
            graph(i) = readLine.trim.split(" ").map(_.toInt).zipWithIndex.filter(_._1 != -1).toList;
        }
        println(mst(size, graph).sum);
    }
    def mst(size: Int, graph: Array[List[(Int, Int)]]): Array[Int] = {
        val dist = new Array[Int](size).map(a => Int.MaxValue);
        val stat = new Array[Int](size); // 0: 未調査, 1: 調査済み
        val pq = new PriorityQueue[(Int, Int)]()(Ordering.by((e: (Int, Int)) => e._1).reverse);
        def go(): Unit = {
            if (!pq.isEmpty) {
                val (cost, idx) = pq.dequeue();
                if (stat(idx) != 1) {
                    dist(idx) = cost;
                    stat(idx) = 1;
                    graph(idx).filter(e => stat(e._2) == 0 && e._1 < dist(e._2)).foreach {e => pq.enqueue(e)}
                }
                go();
            }
        }
        pq.enqueue((0, 0));
        go();
        dist;
    }
}