Advertisement
Guest User

eq

a guest
May 20th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.10 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "github.com/skorobogatov/input"
  5.     "fmt"
  6.     "math/rand"
  7. )
  8.  
  9. // Φ π δ
  10.  
  11. type Automat struct{
  12.     n, m, q0 int
  13.     Δ [][]int
  14.     Φ [][]string
  15. }
  16.  
  17. func main(){
  18.     var a, b Automat
  19.     var v int
  20.     var st string
  21.     input.Scanf("%d%d%d", &a.n, &a.m, &a.q0)
  22.     a.Φ, a.Δ = make([][]string, a.n), make([][]int, a.n)
  23.     for j, d := range a.Δ {
  24.         d = make([]int, a.m)
  25.         for i := 0; i < a.m; i++{
  26.             input.Scanf("%d", &v)
  27.             d[i] = v
  28.         }
  29.         a.Δ[j] = d
  30.     }
  31.     for j, f := range a.Φ {
  32.         f = make([]string, a.m)
  33.         for i := 0; i < a.m; i++{
  34.             input.Scanf("%s", &st)
  35.             f[i] = st
  36.         }
  37.         a.Φ[j] = f
  38.     }
  39.  
  40.     input.Scanf("%d%d%d", &b.n, &b.m, &b.q0)
  41.     b.Φ, b.Δ = make([][]string, b.n), make([][]int, b.n)
  42.     for j, d := range b.Δ {
  43.         d = make([]int, b.m)
  44.         for i := 0; i < b.m; i++{
  45.             input.Scanf("%d", &v)
  46.             d[i] = v
  47.         }
  48.         b.Δ[j] = d
  49.     }
  50.     for j, f := range b.Φ {
  51.         f = make([]string, b.m)
  52.         for i := 0; i < b.m; i++{
  53.             input.Scanf("%s", &st)
  54.             f[i] = st
  55.         }
  56.         b.Φ[j] = f
  57.     }
  58.     if a.Equals(b) {
  59.         fmt.Println("EQUAL")
  60.     } else {
  61.         fmt.Println("NOT EQUAL")
  62.     }
  63. }
  64.  
  65. func (a Automat) Equals (b Automat) (bool) {
  66.     a.AufenkampHohn()
  67.     b.AufenkampHohn()
  68.     a.Canonise()
  69.     b.Canonise()
  70.     if (a.m != b.m || a.n != b.n || a.q0 != b.q0) {
  71.         return false
  72.     }
  73.     for i, d := range a.Δ {
  74.         for j, s := range d {
  75.             if b.Δ[i][j] != s {
  76.                 return false
  77.             }
  78.         }
  79.     }
  80.  
  81.     for i, d := range a.Φ {
  82.         for j, s := range d {
  83.             if b.Φ[i][j] != s {
  84.                 return false
  85.             }
  86.         }
  87.     }
  88.     return true
  89. }
  90.  
  91. func (a *Automat) Canonise() {
  92.     used := make([]int, a.n)
  93.     for i := 0; i < a.n; i++ {
  94.         used[i] = -1
  95.     }
  96.     TNew := make([][]int, a.n)
  97.     for i := range TNew {
  98.         TNew[i] = make([]int, a.m)
  99.     }
  100.     SNew := make([][]string, a.n)
  101.     for i := range SNew {
  102.         SNew[i] = make([]string, a.m)
  103.     }
  104.     index := 0
  105.     index = DFS(used, a.Δ, a.q0, &index, a.m)
  106.     for i := 0; i < a.n; i++ {
  107.         if used[i] != -1 {
  108.             SNew[used[i]] = a.Φ[i]
  109.             for j := 0; j < a.m; j++ {
  110.                 TNew[used[i]][j] = used[a.Δ[i][j]]
  111.             }
  112.         }
  113.     }
  114.     a.n, a.Δ, a.Φ, a.q0, a.m = index, TNew[0:index], SNew[0:index], 0, a.m
  115. }
  116.  
  117. func DFS(used []int, arr [][]int, begin int, index *int, m int) int {
  118.     used[begin] = *index
  119.     (*index)++
  120.     for i := 0; i < m; i++ {
  121.         if used[arr[begin][i]] == -1 {
  122.             *index = DFS(used, arr, arr[begin][i], index, m)
  123.         }
  124.     }
  125.     return (*index)
  126. }
  127.  
  128.  
  129. func (a *Automat) AufenkampHohn() {
  130.     π := make([]int, a.n)
  131.     m1, m2 := -1, -1;
  132.     m1, π = a.Split1()
  133.     for m1 != m2 {
  134.         m2 = m1
  135.         m1, π = a.Split(π)
  136.     }
  137.     help1, help2 := make([]int, a.n), make([]int, a.n)
  138.     for i, j := 0, 0; i < a.n; i++ {
  139.         if π[i] == i {
  140.             help2[j] = i
  141.             help1[i] = j
  142.             j++
  143.         }
  144.     }
  145.     a.n = m1
  146.     a.q0 = help1[π[a.q0]]
  147.     p := make([][]string, a.n)
  148.     for i := 0; i < a.n; i++ {
  149.         p[i] = make([]string, a.m)
  150.     }
  151.     for i := 0; i < a.n; i++ {
  152.         for j := 0; j < a.m; j++ {
  153.             a.Δ[i][j] = help1[π[a.Δ[help2[i]][j]]]
  154.             p[i][j] = a.Φ[help2[i]][j]
  155.         }
  156.     }
  157.     a.Φ = p
  158. }
  159.  
  160. func (a Automat) Split(π []int) (int, []int) {
  161.     m := a.n
  162.     arr := make([]int, m)
  163.     for i := range arr {
  164.         arr[i] = i
  165.     }
  166.     for i := 0; i < a.n; i++ {
  167.         for j := i + 1; j < a.n; j++ {
  168.             if π[i] == π[j] && Find(arr, i) != Find(arr, j) {
  169.                 eq := true
  170.                 for k := 0; k < a.m; k++ {
  171.                     if π[a.Δ[i][k]] != π[a.Δ[j][k]] {
  172.                         eq = false
  173.                         break
  174.                     }
  175.                 }
  176.                 if eq {
  177.                     Union(&arr, i, j)
  178.                     m--
  179.                 }
  180.             }
  181.         }
  182.     }
  183.     for i := 0; i < a.n; i++{
  184.         π[i] = Find(arr, i)
  185.     }
  186.     return m, π
  187. }
  188.  
  189. func (a Automat) Split1() (int, []int) {
  190.     π := make([]int, a.n)
  191.     q := a.n
  192.     arr := make([]int, q)
  193.     for i := range arr{
  194.         arr[i] = i
  195.     }
  196.     for i := 0; i < a.n; i++ {
  197.         for j := i + 1; j < a.n; j++ {
  198.             if Find(arr, i) != Find(arr, j) {
  199.                 eq := true
  200.                 for k := 0; k < a.m; k++ {
  201.                     if a.Φ[i][k] != a.Φ[j][k] {
  202.                         eq = false
  203.                         break
  204.                     }
  205.                 }
  206.                 if eq {
  207.                     Union(&arr, i, j)
  208.                     q--
  209.                 }
  210.             }
  211.         }
  212.     }
  213.     for i := 0; i < a.n; i++ {
  214.         π[i] = Find(arr, i)
  215.     }
  216.     return q, π
  217. }
  218.  
  219. func Union(a *[]int, x int, y int) {
  220.     x_, y_ := Find(*a, x), Find(*a, y)
  221.     if x_ == y_{
  222.         return
  223.     }
  224.     if rand.Int() % 2 == 1 {
  225.         x_, y_ = y_, x_
  226.     }
  227.     (*a)[y_] = x_
  228. }
  229.  
  230. func Find(a []int, x int) int {
  231.     if a[x] == x {
  232.         return x
  233.     } else {
  234.         a[x] = Find(a, a[x])
  235.     }
  236.     return a[x]
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement