2024-01-17 19:54:45 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Edge struct {
|
|
|
|
source int
|
|
|
|
destination int
|
|
|
|
weight int
|
|
|
|
}
|
|
|
|
|
|
|
|
func PrimMST(graph [][]int) {
|
|
|
|
vertexCount := len(graph)
|
|
|
|
parent := make([]int, vertexCount)
|
|
|
|
key := make([]int, vertexCount)
|
|
|
|
mstSet := make([]bool, vertexCount)
|
|
|
|
|
|
|
|
// Initialize key values as infinity
|
|
|
|
for i := 0; i < vertexCount; i++ {
|
|
|
|
key[i] = int(^uint(0) >> 1) // set as maximum int value
|
|
|
|
mstSet[i] = false
|
|
|
|
}
|
|
|
|
|
|
|
|
// Always include the first vertex in MST
|
|
|
|
key[0] = 0 // Make key 0 so that this vertex is picked as first vertex
|
|
|
|
parent[0] = -1 // First node is always the root of MST
|
|
|
|
|
|
|
|
for count := 0; count < vertexCount-1; count++ {
|
|
|
|
u := minKey(key, mstSet, vertexCount)
|
|
|
|
mstSet[u] = true
|
|
|
|
|
|
|
|
for v := 0; v < vertexCount; v++ {
|
|
|
|
if graph[u][v] != 0 && mstSet[v] == false && graph[u][v] < key[v] {
|
|
|
|
parent[v] = u
|
|
|
|
key[v] = graph[u][v]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Print the constructed MST
|
|
|
|
fmt.Println("Edge \tWeight")
|
|
|
|
for i := 1; i < vertexCount; i++ {
|
|
|
|
fmt.Printf("%d - %d \t%d\n", parent[i], i, graph[i][parent[i]])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func minKey(key []int, mstSet []bool, vertexCount int) int {
|
|
|
|
min := int(^uint(0) >> 1)
|
|
|
|
minIndex := -1
|
|
|
|
|
|
|
|
for v := 0; v < vertexCount; v++ {
|
|
|
|
if mstSet[v] == false && key[v] < min {
|
|
|
|
min = key[v]
|
|
|
|
minIndex = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return minIndex
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
graph := [][]int{
|
|
|
|
{0, 2, 0, 6, 0},
|
|
|
|
{2, 0, 3, 8, 5},
|
|
|
|
{0, 3, 0, 0, 7},
|
|
|
|
{6, 8, 0, 0, 9},
|
|
|
|
{0, 5, 7, 9, 0},
|
|
|
|
}
|
|
|
|
|
|
|
|
PrimMST(graph)
|
2024-01-20 08:55:19 +00:00
|
|
|
}
|