forked from yourbasic/graph
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmst.go
34 lines (32 loc) · 821 Bytes
/
mst.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package graph
// MST computes a minimum spanning tree for each connected component
// of an undirected weighted graph.
// The forest of spanning trees is returned as a slice of parent pointers:
// parent[v] is either the parent of v in a tree,
// or -1 if v is the root of a tree.
//
// The time complexity is O(|E|⋅log|V|), where |E| is the number of edges
// and |V| the number of vertices in the graph.
func MST(g Iterator) (parent []int) {
n := g.Order()
parent = make([]int, n)
cost := make([]int64, n)
for i := range parent {
parent[i] = -1
cost[i] = Max
}
// Prim's algorithm
Q := newPrioQueue(cost)
for Q.Len() > 0 {
v := Q.Pop()
g.Visit(v, func(w int, c int64) (skip bool) {
if Q.Contains(w) && c < cost[w] {
cost[w] = c
Q.Fix(w)
parent[w] = v
}
return
})
}
return
}