Guest User

Untitled

a guest
Oct 1st, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.20 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.         "fmt"
  5.         "github.com/skorobogatov/input"
  6. )
  7.  
  8. type Automat struct {
  9.     enter int
  10.     in    [][]int
  11.     out   [][]string
  12.     color []int
  13.     r     []int
  14. }
  15.  
  16. type Pair struct {
  17.     f, s int
  18. }
  19.  
  20. func Union(arrIn []int, a, b int) {
  21.     for i := 0; i < len(arrIn); i++ {
  22.         if arrIn[i] == a {
  23.             arrIn[i] = b
  24.         }
  25.     }
  26. }
  27.  
  28. func Split1(aut *Automat) (l int, arrOut []int) {
  29.     l = len(aut.in)
  30.     lfix := l
  31.     arrOut = make([]int, l)
  32.     for i := 0; i < lfix; i++ {
  33.         arrOut[i] = i
  34.     }
  35.     for i := 0; i < lfix; i++ {
  36.         for j := i + 1; j < lfix; j++ {
  37.             if arrOut[i] != arrOut[j] {
  38.                 b := true
  39.                 for k := 0; k < len(aut.in[aut.enter]); k++ {
  40.                     if aut.out[i][k] != aut.out[j][k] {
  41.                         b = false
  42.                         break
  43.                     }
  44.                 }
  45.                 if b {
  46.                     Union(arrOut, arrOut[i], arrOut[j])
  47.                     l--
  48.                 }
  49.             }
  50.         }
  51.     }
  52.     return
  53. }
  54.  
  55. func Split(aut *Automat, arrIn []int) (l int, arrOut []int) {
  56.     l = len(aut.in)
  57.     lfix := l
  58.     arrOut = make([]int, l)
  59.     for i := 0; i < l; i++ {
  60.         arrOut[i] = i
  61.     }
  62.     for i := 0; i < lfix; i++ {
  63.         for j := i + 1; j < lfix; j++ {
  64.             if arrIn[i] == arrIn[j] && arrOut[i] != arrOut[j] {
  65.                 b := true
  66.                 for k := 0; k < len(aut.in[aut.enter]); k++ {
  67.                     w1, w2 := aut.in[i][k], aut.in[j][k]
  68.                     if arrIn[w1] != arrIn[w2] {
  69.                         b = false
  70.                         break
  71.                     }
  72.                 }
  73.                 if b {
  74.                     Union(arrOut, arrOut[i], arrOut[j])
  75.                     l--
  76.                 }
  77.             }
  78.         }
  79.     }
  80.     return
  81. }
  82.  
  83. func Search(arr []Pair, a int) (int, bool) {
  84.     for i := 0; i < len(arr); i++ {
  85.         if a == arr[i].f {
  86.             return arr[i].s, true
  87.         }
  88.     }
  89.     return 0, false
  90. }
  91.  
  92. func Aufenkamp_Hohn(aut *Automat) (autMin *Automat) {
  93.     /*for i := 0; i < len(aut.in); i++ {
  94.         for j := 0; j < len(aut.in[i]); j++ {
  95.             fmt.Printf("%d ", aut.in[i][j])
  96.         }
  97.         fmt.Printf("\n")
  98.     }*/
  99.     m, arrOut := Split1(aut)
  100.     /*for i := 0; i < len(arrOut); i++ {
  101.         fmt.Printf("%d ", arrOut[i])
  102.     }
  103.     fmt.Printf("\n")*/
  104.     for {
  105.         m2, arrOut2 := Split(aut, arrOut)
  106.         if m == m2 {
  107.             break
  108.         }
  109.         m, arrOut = m2, arrOut2
  110.     }
  111.     /*for i := 0; i < len(arrOut); i++ {
  112.         fmt.Printf("%d ", arrOut[i])
  113.     }
  114.     fmt.Printf("\n")*/
  115.     var arr []Pair
  116.     var p Pair
  117.     for i, v := range arrOut {
  118.         u, b := Search(arr, v)
  119.         if b {
  120.             arrOut[i] = u
  121.         } else {
  122.             arrOut[i] = len(arr)
  123.             p.f = v
  124.             p.s = len(arr)
  125.             arr = append(arr, p)
  126.         }
  127.     }
  128.     /*for i := 0; i < len(arrOut); i++ {
  129.         fmt.Printf("%d ", arrOut[i])
  130.     }
  131.     fmt.Printf("\n")*/
  132.     var aut2 Automat
  133.     z := len(aut.in[aut.enter])
  134.     aut2.out = make([][]string, m)
  135.     for i := 0; i < m; i++ {
  136.         aut2.out[i] = make([]string, z)
  137.     }
  138.     aut2.in = make([][]int, m)
  139.     for i := 0; i < m; i++ {
  140.         aut2.in[i] = make([]int, z)
  141.     }
  142.     aut2.enter = 0
  143.     autMin = &aut2
  144.     for i := 0; i < len(aut.in); i++ {
  145.         q := arrOut[i]
  146.         if i == aut.enter {
  147.             autMin.enter = q
  148.         }
  149.         for j := 0; j < len(aut.in[aut.enter]); j++ {
  150.             autMin.in[q][j] = arrOut[aut.in[i][j]]
  151.             autMin.out[q][j] = aut.out[i][j]
  152.         }
  153.     }
  154.     /*for i := 0; i < len(autMin.in); i++ {
  155.         for j := 0; j < len(autMin.in[i]); j++ {
  156.             fmt.Printf("%d ", autMin.in[i][j])
  157.         }
  158.         fmt.Printf("\n")
  159.     }*/
  160.     return
  161. }
  162.  
  163. var k int
  164. var out []int
  165. var counter = 0
  166.  
  167. func VisitVertex(aut *Automat, a int) {
  168.     if aut.color[a] == 0 {
  169.         aut.color[a] = 1
  170.         aut.r[a] = counter
  171.         out = append(out, a)
  172.         counter++
  173.         for _, k := range aut.in[a] {
  174.             VisitVertex(aut, k)
  175.         }  
  176.         aut.color[a] = 2
  177.     }
  178. }
  179.  
  180. func main() {
  181.     var n, m, q int
  182.     input.Scanf("%d %d %d", &n, &m, &q)
  183.     var aut Automat
  184.     aut.in = make([][]int, n)
  185.     for i := 0; i < n; i++ {
  186.         aut.in[i] = make([]int, m)
  187.         for j := 0; j < m; j++ {
  188.             input.Scanf(" %d", &aut.in[i][j])
  189.         }
  190.     }
  191.     aut.out = make([][]string, n)
  192.     for i := 0; i < n; i++ {
  193.         aut.out[i] = make([]string, m)
  194.         for j := 0; j < m; j++ {
  195.             input.Scanf(" %s", &aut.out[i][j])
  196.         }
  197.     }
  198.     aut.enter = q
  199.     autCon := Aufenkamp_Hohn(&aut)
  200.     /*for i := 0; i < len(autCon.in); i++ {
  201.         for j := 0; j < len(autCon.in[i]); j++ {
  202.             fmt.Printf("%d ", autCon.in[i][j])
  203.         }
  204.         fmt.Printf("\n")
  205.     }*/
  206.     autCon.color = make([]int, len(autCon.in))
  207.     autCon.r = make([]int, len(autCon.in))
  208.     VisitVertex(autCon, autCon.enter)
  209.     //fmt.Printf("%d --", autCon.enter)
  210.     var autFinal Automat
  211.     m = len(out)
  212.     autFinal.in = make([][]int, m)
  213.     for i, val1 := range out {
  214.         autFinal.in[i] = make([]int, len(autCon.in[0]))
  215.         for j, val2 := range autCon.in[val1] {
  216.             autFinal.in[i][j] = autCon.r[val2]
  217.         }
  218.     }
  219.     autFinal.out = make([][]string, m)
  220.     for i, val1 := range out {
  221.         autFinal.out[i] = make([]string, len(autCon.out[0]))
  222.         for j, val2 := range autCon.out[val1] {
  223.             autFinal.out[i][j] = val2
  224.         }
  225.     }
  226.     counter = m
  227.     fmt.Printf("digraph {\n")
  228.     fmt.Printf("\trankdir = LR\n")
  229.     fmt.Printf("\tdummy [label = \"\", shape = none]\n")
  230.     for i := 0; i < counter; i++ {
  231.         fmt.Printf("\t%d [shape = circle]\n", i)
  232.     }
  233.     fmt.Printf("\tdummy -> 0\n")
  234.     for i := 0; i < counter; i++ {
  235.         for j := 0; j < len(autCon.in[i]); j++ {
  236.             fmt.Printf("\t%d -> %d [label = \"%c(%s)\"]\n", i, autFinal.in[i][j], 97+j, autFinal.out[i][j])
  237.         }
  238.     }
  239.     fmt.Printf("}\n")
  240. }
  241.  
  242. // 5 3 0 1 2 3 3 4 1 3 4 2 3 0 4 4 4 3 x x y y x x y x x x x y x y x
  243.  
  244. // 9 3 1 2 3 0 2 3 1 7 6 4 8 5 4 4 4 4 8 6 4 7 5 4 7 7 8 8 8 7 x y x x y x x y x x y x x y x y x y y x y x y x x y x
  245.  
  246. // 5 2 1 0 4 1 4 4 0 4 4 2 4 x z z z x z z x x z
Add Comment
Please, Sign In to add comment