Advertisement
Pug_coder

PIRM

May 7th, 2021
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.60 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "github.com/skorobogatov/input"
  6. )
  7. type Graph struct {
  8.     value [][]int
  9.     used []bool
  10.     min_e []int
  11.     sel_e []int
  12. }
  13. const INF = 2147483647
  14. var v, result int
  15. func PRIM(graph Graph) {
  16.     graph.min_e[0] = 0
  17.     for i := 0; i < len(graph.value); i++ {
  18.         v = -1
  19.         for j := 0; j < len(graph.value); j++ {
  20.             if !graph.used[j] && (v == -1 || graph.min_e[j] < graph.min_e[v]) {
  21.                 v = j
  22.             }
  23.         }
  24.         if graph.min_e[v] == INF {
  25.             fmt.Println("No MST!")
  26.             break
  27.         }
  28.         graph.used[v] = true
  29.         if graph.sel_e[v] != -1 {
  30.             result += graph.min_e[v]
  31.         }
  32.         for to := 0; to < len(graph.value); to++ {
  33.             if graph.value[v][to] < graph.min_e[to] {
  34.                 graph.min_e[to] = graph.value[v][to]
  35.                 graph.sel_e[to] = v
  36.             }
  37.         }
  38.     }
  39. }
  40. func main() {
  41.     var n, m int
  42.     var graph Graph
  43.     input.Scanf("%d \n %d", &n, &m)
  44.     graph.value = make([][]int, n)
  45.     graph.used = make([]bool, n)
  46.     graph.min_e = make([]int, n)
  47.     graph.sel_e = make([]int,n)
  48.     for i := 0; i < n; i++ {
  49.         graph.value[i] = make([]int, n)
  50.         for j := 0; j < n; j++ {
  51.             graph.value[i][j] = INF
  52.         }
  53.     }
  54.     for i := 0; i < n; i++ {
  55.         graph.min_e[i] = INF
  56.     }
  57.  
  58.     for i := 0; i < n; i++ {
  59.         graph.sel_e[i] = -1
  60.     }
  61.     for i := 0; i < m; i++ {
  62.         var indexA, indexB, dist int
  63.         input.Scanf("%d %d %d", &indexA, &indexB, &dist)
  64.         //graph[indexA] = append(graph[indexA], dist)
  65.         graph.value[indexA][indexB] = dist
  66.         graph.value[indexB][indexA] = dist
  67.         //graph[indexB] = append(graph[indexB], dist)
  68.     }
  69.     //for i:=0;i < n; i++ {fmt.Println(min_e[i])}
  70.     //for i:=0;i < n; i++ {fmt.Println(graph.value[i])}
  71.     PRIM(graph)
  72.     fmt.Println(result)
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement