Advertisement
Ladies_Man

MST_Kruskal - Дорожки

Apr 22nd, 2014
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.62 KB | None | 0 0
  1. package main
  2. import "fmt"
  3. import "math"
  4.  
  5. type vertex struct {
  6.         x, y   int
  7.     parent *vertex
  8.     edge   *edge
  9.     depth  int
  10. }
  11.  
  12. type edge struct {
  13.     u, v   int
  14.     length float64
  15. }
  16.  
  17. func Find(x *vertex) *vertex { if x.parent == x { return x } return Find(x.parent) }
  18.  
  19. func Union(x, y *vertex) {
  20.     if rootx, rooty := Find(x), Find(y); rootx.depth < rooty.depth { rootx.parent = rooty }
  21.         else { if rooty.parent = rootx; rootx.depth == rooty.depth && rootx != rooty { rootx.depth++ } }
  22. }
  23.  
  24. func Heapify(i, n int, P []edge) {
  25.     for {
  26.         l := 2*i + 1
  27.         r := l + 1
  28.         j := i
  29.         if l < n && P[i].length > P[l].length { i = l }
  30.         if r < n && P[i].length > P[r].length { i = r }
  31.         if i == j { break }
  32.         P[i], P[j] = P[j], P[i]
  33.     }
  34. }
  35.  
  36. func main() {
  37.     var k, y, x, n, i int
  38.     var res_len float64
  39.     fmt.Scanf("%d\n", &n) //number of elements
  40.  
  41.     V_G := make([]vertex, n)
  42.     E_G := make([]edge, n*(n-1)/2)
  43.        
  44.     for i < n {
  45.         fmt.Scanf("%d %d\n", &x, &y) //coordiantes of elements
  46.         V_G[i].x = x
  47.         V_G[i].y = y
  48.         V_G[i].parent = &V_G[i]
  49.         i++
  50.     }
  51.  
  52.     for i := 0; i < n; i++ {
  53.         for j := i + 1; j < n; j++ {
  54.             ax := V_G[j].x - V_G[i].x
  55.             ay := V_G[j].y - V_G[i].y
  56.             E_G[k].length = math.Pow(((float64)(ax*ax + ay*ay)), 0.5)
  57.             E_G[k].v = i
  58.             E_G[k].u = j
  59.             k++
  60.         }
  61.     }
  62.     for i := k/2 - 1; i >= 0; i-- { Heapify(i, k, E_G) }
  63.     k--
  64. //MST_Kruskal
  65.     for i = 0; i < n-1; {
  66.         if u, v := E_G[0].u, E_G[0].v; Find(&V_G[u]) != Find(&V_G[v]) {
  67.             res_len  += E_G[0].length
  68.             Union(Find(&V_G[u]), Find(&V_G[v]))
  69.             i++
  70.         }
  71.         E_G[0], E_G[k] = E_G[k], E_G[0]
  72.         Heapify(0, k, E_G)
  73.         k--
  74.     }
  75.    
  76.     fmt.Prntf("%.2f\n", res_len )
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement