Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type Vort struct {
  8. ord int
  9. ind []int
  10. num []int
  11. br map[string][]int
  12. I map[int]bool
  13. hl map[int][]string
  14. final bool
  15. }
  16.  
  17. func sort(a []int) ([]int) {
  18. for j := 0; j < len(a) - 1; j++ {
  19. for i := 0; i < len(a) - j - 1; i++ {
  20. if a[i] > a[i+1] {
  21. a[i], a[i+1] = a[i+1], a[i]
  22. }
  23. }
  24. }
  25. return a
  26. }
  27.  
  28. func checkWord(a []string, b string) (bool) {
  29. for i := 0; i < len(a); i++ {
  30. if a[i] == b {
  31. return true
  32. }
  33. }
  34. return false
  35. }
  36.  
  37. func check(a []int, b int) (bool) {
  38. for i := 0; i < len(a); i++ {
  39. if a[i] == b {
  40. return true
  41. }
  42. }
  43. return false
  44. }
  45.  
  46. func Closure(G []Vort,z [] int) ([]int) {
  47. C := make([]int, 0)
  48. for i := 0; i < len(z); i++ {
  49. C = DFS(G, z[i], C)
  50. }
  51. return sort(C)
  52. }
  53.  
  54. func DFS(G []Vort, q int ,C []int) ([]int ) {
  55. if !check(C, q){
  56. C = append(C, q)
  57. t := G[q].br["lambda"]
  58. for i := 0; i < len(t); i++ {
  59. C = DFS(G, t[i], C)
  60. }
  61. }
  62. return C
  63. }
  64.  
  65. func cmp(a []int, b []int) (bool) {
  66. if len(a) != len(b){
  67. return false
  68. }
  69. for i := 0; i < len(a); i++ {
  70. if !check(b, a[i]){
  71. return false
  72. }
  73. }
  74. return true
  75. }
  76.  
  77. func Ord(a []int,b []Vort) (int) {
  78. for i := 0; i < len(b); i++ {
  79. if cmp(b[i].ind, a){
  80. return i
  81. }
  82. }
  83. return -1
  84. }
  85.  
  86. func Det(dictionary []string,G []Vort, q int) ([]Vort) {
  87. ord := 0
  88. Q := make([]Vort, 0)
  89. q0 := Closure(G, []int{q})
  90. var tmp Vort
  91. tmp = makeV(tmp)
  92. tmp.ind = q0
  93. tmp.ord = ord
  94. Q = append(Q, tmp)
  95. ord++
  96. st := make([]Vort, 0)
  97. st = append(st, tmp)
  98. for len(st) != 0 {
  99. z := st[len(st) - 1]
  100. st = st[:len(st) - 1]
  101. for i := 0; i < len(z.ind); i++ {
  102. if G[z.ind[i]].final {
  103. Q[z.ord].final = true
  104. break
  105. }
  106. }
  107. for i := 0; i < len(dictionary); i++ {
  108. s := dictionary[i]
  109. if s == "lambda" {
  110. continue
  111. }
  112. Z := make([]int, 0)
  113. for j := 0; j < len(z.ind); j++ {
  114. Z = append(Z, G[z.ind[j]].br[s]...)
  115. }
  116. Z = Closure(G, Z)
  117. k := Ord(Z, Q)
  118. if k == -1 {
  119. var t Vort
  120. t = makeV(t)
  121. t.ord = ord
  122. k = ord
  123. ord++
  124. t.ind = Z
  125. Q = append(Q, t)
  126. st = append(st, t)
  127. }
  128. if !Q[z.ord].I[k]{
  129. Q[z.ord].I[k] = true
  130. Q[z.ord].num = append(Q[z.ord].num, k)
  131. }
  132. Q[z.ord].hl[k] = append(Q[z.ord].hl[k], s)
  133. Q[z.ord].br[s] = append(Q[z.ord].br[s], Z...)
  134. }
  135. }
  136. return Q
  137. }
  138.  
  139. func makeV(a Vort) (Vort) {
  140. a.br = make(map[string][]int)
  141. a.hl = make(map[int][]string)
  142. a.I = make(map[int]bool)
  143. a.final = false
  144. return a
  145. }
  146.  
  147. func main() {
  148. var m, n, start int
  149. fmt.Scan(&m,&n)
  150. G := make([]Vort, n)
  151. for i := 0; i < n; i++ {
  152. G[i] = makeV(G[i])
  153. }
  154. dictionary := make([]string, 0)
  155. for i := 0; i < n; i++ {
  156. var t, k int
  157. var s string
  158. fmt.Scan(&t,&k,&s)
  159. G[t].ord = t
  160. G[t].ind = append(G[t].ind, t)
  161. G[t].br[s] = append(G[t].br[s], k)
  162. if !checkWord(dictionary,s){
  163. dictionary = append(dictionary, s)
  164. }
  165. }
  166. for i := 0; i < m; i++ {
  167. var t int
  168. fmt.Scan(&t)
  169. if t == 0{
  170. G[i].final = false
  171. }else {
  172. G[i].final = true
  173. }
  174. }
  175. fmt.Scan(&start)
  176. Q := Det(dictionary, G, start)
  177. fmt.Print("digraph {\n rankdir = LR\n dummy [label = \"\", shape = none]\n")
  178. for i := 0; i < len(Q); i++{
  179. fmt.Printf(" %d [label = \"", i)
  180. fmt.Print(Q[i].ind)
  181. fmt.Print("\", shape = ")
  182. if Q[i].final {
  183. fmt.Print("doublecircle]\n")
  184. } else {
  185. fmt.Print("circle]\n")
  186. }
  187. }
  188. fmt.Printf(" dummy -> %d\n",start)
  189. for i := 0; i < len(Q); i++ {
  190. for j := 0; j < len(Q[i].num); j++ {
  191. fmt.Printf(" %d -> %d [label = \"", i, Q[i].num[j])
  192. for o := 0; o < len(Q[i].hl[Q[i].num[j]]); o++ {
  193. fmt.Printf("%s", Q[i].hl[Q[i].num[j]][o])
  194. if o != len(Q[i].hl[Q[i].num[j]]) - 1{
  195. fmt.Print(", ")
  196. }
  197. }
  198. fmt.Println("\"]")
  199. }
  200. }
  201. fmt.Print("}")
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement