Advertisement
Ladies_Man

Min Mealy (минимизац Мили)

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