Advertisement
Ladies_Man

Mealy EQual (эквивалентность мили)

Jun 10th, 2014
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.44 KB | None | 0 0
  1. package main
  2.  
  3. import "os"
  4. import "fmt"
  5. import "github.com/skorobogatov/input"
  6.  
  7. var time int
  8. var h1, h2 []int
  9.  
  10. func Split(delta [][]int, phi [][]string, pi []int, q0 int) (int, []int) {
  11.     m_classes := len(delta)
  12.     pi1 := make([]int, 0, m_classes)
  13.         var Union func(int, int, int)
  14.     Union = func(x, y, z int) {
  15.         for z < len(pi1) {
  16.             if pi1[z] == x { pi1[z] = y }
  17.             z++
  18.         }
  19.     }
  20.     for i, _ := range delta { pi1 = append(pi1, i) }
  21.     for i, _ := range delta {
  22.         for j, _ := range delta {
  23.             if pi[i] == pi[j] && pi1[i] != pi1[j] {
  24.                 eq := true
  25.                 for k := 0; k < len(delta[q0]); k++ {
  26.                     w1, w2 := delta[i][k], delta[j][k]
  27.                     if pi[w1] != pi[w2] {
  28.                         eq = false
  29.                         break
  30.                     }
  31.                 }
  32.                 if eq {
  33.                     Union(pi1[i], pi1[j], 0)
  34.                     m_classes--
  35.                 }
  36.             }
  37.         }
  38.     }
  39.     return m_classes, pi1
  40. }
  41.  
  42. func DFS(q int, delta [][]int, phi [][]string) {
  43.     if 0 > h1[q] {
  44.         h1[q], time, h2 = time, time+1, append(h2, q)
  45.         for i := 0; i < len(delta[q]); i++ { DFS(delta[q][i], delta, phi) }
  46.     }
  47. }
  48.  
  49. func Init_canon_auto(delta [][]int, phi [][]string, q0 int) (delta1 [][]int, phi1 [][]string, yes bool) {
  50.     delta1, phi1, yes = make([][]int, time), make([][]string, time), false
  51.     for i := 0; i < time; i++ { delta1[i], phi1[i] = make([]int, len(delta[0])), make([]string, len(delta[q0])) }
  52.     for i := 0; i < time; i++ {
  53.         yes = true
  54.         x, curr1, curr2 := h2[i], -1, "x"
  55.         for j := 0; j < len(delta[x]); j++ {
  56.             curr1 = delta[x][j]
  57.             delta1[i][j] = h1[curr1]
  58.         }
  59.         for j := 0; j < len(phi[x]); j++ {
  60.             curr2 = phi[x][j]
  61.             phi1[i][j] = curr2
  62.         }
  63.     }
  64.     return
  65. }
  66.  
  67. func AufenkampHohn(delta [][]int, phi [][]string, q0 int) ([][]int, [][]string) {
  68. //Split1 {
  69.     m := len(delta)
  70.     pi := make([]int, 0, m)
  71.     for i, _ := range delta { pi = append(pi, i) }
  72.     for i, _ := range delta {
  73.         for j, _ := range delta {
  74.             if pi[i] != pi[j] {
  75.                 eq := true
  76.                 for k := 0; k < len(delta[0]); k++ {
  77.                     if phi[i][k] != phi[j][k] {
  78.                         eq = false
  79.                         break
  80.                     }
  81.                 }
  82.                 if eq {
  83.                     for q := 0; q < len(pi); q++ { if pi[q] == pi[i] { pi[q] = pi[j] } }
  84.                     m--
  85.                 }
  86.             }
  87.         }
  88.     }
  89. // } Split1
  90.     for {
  91.         m1, pi1 := Split(delta, phi, pi, q0)
  92.         if m == m1 { break }
  93.         m, pi = m1, pi1
  94.     }
  95.     h3 := make(map[int]int, len(pi))
  96.    
  97.     var Exists func(int) bool
  98.     Exists = func(v int) bool { _, ok := h3[v]; if ok { return true }; return false }
  99.  
  100.     for i, x := range pi {
  101.         if Exists(x) { y := h3[x]; pi[i] = y } else { pi[i], h3[x] = len(h3), len(h3) }
  102.     }
  103.  
  104.     delta1, phi1, q01 := make([][]int, m), make([][]string, m), 0
  105.     for i := 0; i < m; i++ { delta1[i], phi1[i] = make([]int, len(delta[q0])), make([]string, len(delta[q0]) )}
  106.    
  107.     for i := 0; i < len(delta); i++ {
  108.         q := pi[i]
  109.         if i == q0 { q01 = q }
  110.         for j := 0; j < len(delta[q0]); j++ { delta1[q][j], phi1[q][j] = pi[delta[i][j]], phi[i][j] }
  111.     }
  112.  
  113.     DFS(q01, delta1, phi1)
  114.    
  115.     new_delta, new_phi, ok := Init_canon_auto(delta1, phi1, 0)
  116.    
  117.     if ok { return new_delta, new_phi }; return nil, nil
  118. }
  119.  
  120. func Read(n, m int) ([][]int, [][]string) {
  121.     a, b := make([][]int, n), make([][]string, n)
  122.     h1, h2, time = make([]int, n), make([]int, 0, n), 0
  123.     for i := 0; i < n; i++ { a[i], b[i], h1[i] = make([]int, m), make([]string, m), -1 }
  124.     for i := 0; i < n; i++ { for j := 0; j < m; j++ { input.Scanf("%d", &a[i][j]) } }
  125.     for i := 0; i < n; i++ { for j := 0; j < m; j++ { input.Scanf("%s", &b[i][j]) } }
  126.     return a, b
  127. }
  128.  
  129. func main() {
  130.     var n2, m2, q_start2, mark_delta, mark_phi int = 0,0,0,0,0
  131. //Auto 1
  132.     input.Scanf("%d\n%d\n%d\n", &n2, &m2, &q_start2)
  133.     delta2, phi2 := Read(n2, m2)
  134.     minimized_delta2, minimized_phi2 := AufenkampHohn(delta2, phi2, q_start2)
  135. //Auto 2
  136.     var n3, m3, q_start3 int
  137.     input.Scanf("%d\n%d\n%d\n", &n3, &m3, &q_start3)
  138.     delta3, phi3 := Read(n3, m3)
  139.     minimized_delta3, minimized_phi3 := AufenkampHohn(delta3, phi3, q_start3)
  140. //Compare
  141.     if len(minimized_delta2) != len(minimized_delta3 || len(minimized_delta2[0]) != len(minimized_delta3[0]) { fmt.Printf("NOT EQUAL\n"); os.Exit(1) }
  142.     for i := 0; i < len(minimized_delta2); i++ { for j := 0; j < len(minimized_delta2[0]); j++ { if minimized_delta2[i][j] == minimized_delta3[i][j] { mark_delta++ } } }
  143.     for i := 0; i < len(minimized_phi2); i++ { for j := 0; j < len(minimized_phi2[0]); j++ { if minimized_phi2[i][j] == minimized_phi3[i][j] { mark_phi++ } } }
  144.     if mark_delta == len(minimized_delta2)*len(minimized_delta2[0]) && mark_phi == len(minimized_phi2)*len(minimized_phi2[0]) { fmt.Printf("EQUAL\n") } else { fmt.Printf("NOT EQUAL\n") }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement