Advertisement
Guest User

Untitled

a guest
Sep 10th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.81 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.         "fmt"
  5.     "os"
  6. )
  7.  
  8. type Vertex struct {
  9.     num , depth , newnum int
  10.     parent *Vertex
  11.     delta []int
  12.     phi []string
  13.     start , visited bool
  14. }
  15.  
  16. var time int = 0
  17.  
  18. func main(){
  19.     var (
  20.         n , m , q0 int
  21.     )
  22.  
  23.     _ , er := fmt.Scan(&n , &m , &q0)
  24.     err(er) // Ошибка
  25.     arr := make([]Vertex , n);
  26.  
  27.     for i := 0 ; i < n ; i++ {
  28.         arr[i].delta = make([]int , m)
  29.         for j := 0 ; j < m ; j++ {
  30.             _ , er = fmt.Scan(&arr[i].delta[j])
  31.             err(er)
  32.             arr[i].num = i
  33.             arr[i].visited , arr[i].start = false , false
  34.             arr[i].depth = 0
  35.             arr[i].newnum = -999
  36.         }
  37.     }
  38.  
  39.     for i := 0 ; i < n ; i++ {
  40.         arr[i].phi = make([]string , m)
  41.         for j := 0 ; j < m ; j++ {
  42.             _ , er = fmt.Scan(&arr[i].phi[j])
  43.             err(er)
  44.         }
  45.     }
  46.  
  47.     temparr := aufenkampHohn(arr, q0)
  48.     for i := range temparr {
  49.         if !temparr[i].start {
  50.             continue
  51.         } else {
  52.             dfs(&temparr[i], temparr)
  53.             break
  54.         }
  55.     }
  56.     temp := make([]Vertex, time)
  57.     for i := 0; i < len(temparr); i++ {
  58.         if temparr[i].newnum == -999 {
  59.             continue
  60.         } else {
  61.             temp[temparr[i].newnum] = temparr[i]
  62.         }
  63.     }
  64.     fmt.Print("digraph {\n")
  65.     fmt.Print("\trankdir = LR\n")
  66.     fmt.Print("\tdummy [label = \"\", shape = none]\n")
  67.     for i := 0; i < len(temp); i++ {
  68.         _ , er := fmt.Print("\t",i , " [shape = circle]\n")
  69.         err(er)
  70.     }
  71.     fmt.Print("\tdummy -> 0\n")
  72.     for i := 0; i < len(temp); i++ {
  73.         for j := 0; j < len(temp[i].delta); j++ {
  74.             r := 0
  75.             for r = 0; r < len(arr); r++ {
  76.                 if temp[i].delta[j] == temp[r].num {
  77.                     break
  78.                 }
  79.             }
  80.             a := rune(97 + j)
  81.             _ , er := fmt.Printf("\t%d -> %d [label = \"%c(%s)\"]\n",
  82.                 temp[i].newnum,
  83.                 temp[r].newnum,
  84.                 a,
  85.                 temp[i].phi[j])
  86.             err(er)
  87.         }
  88.     }
  89.     fmt.Print("}")
  90. }
  91.  
  92. func err(er interface{}){
  93.     //Обработка ошибок
  94.     if er != nil {
  95.         os.Exit(-1)
  96.     }
  97. }
  98.  
  99. func find(v *Vertex) *Vertex {
  100.     for v != v.parent{ v = v.parent }
  101.     return v
  102. }
  103.  
  104. func union(v, y *Vertex) {
  105.     rootx := find(v)
  106.     rooty := find(y)
  107.     if rootx.depth < rooty.depth {
  108.         rootx.parent = rooty
  109.     } else {
  110.         rooty.parent = rootx
  111.         if rootx.depth == rooty.depth && rootx != rooty {
  112.             rootx.depth++
  113.         }
  114.     }
  115. }
  116.  
  117. func belongsTo(v *Vertex , arr *[]Vertex) bool {
  118.     for i := 0 ; i < len(*arr) ; i++ {
  119.         if v.num == (*arr)[i].num {
  120.             return true
  121.         }
  122.     }
  123.     return false
  124. }
  125.  
  126. func split1(arr []Vertex) ([]*Vertex , int) {
  127.     m := len(arr)
  128.     for i := range arr {
  129.         arr[i].parent = &arr[i]
  130.         arr[i].depth = 0
  131.     }
  132.     temp := 0
  133.     for i1, q1 := range arr {
  134.         for i2, q2 := range arr {
  135.             if find(&arr[i1]) != find(&arr[i2]) {
  136.                 eq := true
  137.                 for i := 0; i < len(q1.delta); i++ {
  138.                     if q1.phi[i] == q2.phi[i] {
  139.                         eq = true
  140.                     } else {
  141.                         eq = false
  142.                         break
  143.                     }
  144.                 }
  145.                 if !eq {
  146.                     temp++
  147.                 } else {
  148.                     union(&arr[i1], &arr[i2])
  149.                     m--
  150.                 }
  151.             }
  152.         }
  153.     }
  154.     pi := make([]*Vertex, len(arr))
  155.     for i, q := range arr { pi[q.num] = find(&arr[i]) }
  156.     return pi, m
  157. }
  158.  
  159. func split(arr []Vertex, pi []*Vertex) ([]*Vertex, int) {
  160.     m := len(arr)
  161.     for i := range arr {
  162.         arr[i].parent = &arr[i]
  163.         arr[i].depth = 0
  164.     }
  165.     temp := 0
  166.     for i1, q1 := range arr {
  167.         for i2, q2 := range arr {
  168.             if pi[q1.num] == pi[q2.num] && find(&q1) != find(&q2) {
  169.                 eq := true
  170.                 for i := 0; i < len(q1.delta); i++ {
  171.                     omega1 := q1.delta[i]
  172.                     omega2 := q2.delta[i]
  173.                     if pi[omega1] != pi[omega2] {
  174.                         eq = false
  175.                         break
  176.                     }
  177.                 }
  178.                 if !eq {
  179.                     temp++
  180.                 }else {
  181.                     union(&arr[i1], &arr[i2])
  182.                     m--
  183.                 }
  184.             }
  185.         }
  186.     }
  187.     for i, q := range arr { pi[q.num] = find(&arr[i]) }
  188.     return pi, m
  189. }
  190.  
  191. func aufenkampHohn(arr []Vertex, q0 int) []Vertex {
  192.     pi, m := split1(arr)
  193.     mtemp := 0
  194.     for 1 == 1 {
  195.         pi, mtemp = split(arr, pi)
  196.         if m == mtemp {
  197.             break
  198.         }
  199.         m = mtemp
  200.     }
  201.     find(&arr[q0]).start = true
  202.     tQ := make([]Vertex, 0)
  203.     for i := 0 ; i < len(arr) ; i++{
  204.         temp := &arr[i]
  205.         tq := pi[temp.num]
  206.         if !belongsTo(tq, &tQ) {
  207.             tQ = append(tQ, *tq)
  208.             for i := 0; i < len(temp.delta); i++ {
  209.                 tq.delta[i] = pi[temp.delta[i]].num
  210.                 tq.phi[i] = temp.phi[i]
  211.             }
  212.         }
  213.     }
  214.     return tQ
  215. }
  216.  
  217. func dfs(v *Vertex, arr []Vertex) {
  218.     if !v.visited {
  219.         v.visited = true
  220.         v.newnum = time
  221.         time++
  222.         for i := 0; i < len(v.delta); i++ {
  223.             temp := false
  224.             j := 0
  225.             for j = 0; j < len(arr); j++ {
  226.                 if v.delta[i] == arr[j].num {
  227.                     temp = true
  228.                     break
  229.                 }
  230.             }
  231.             if temp {
  232.                 dfs(&arr[j], arr)
  233.             } else {
  234.                 dfs(nil , arr)
  235.             }
  236.         }
  237.     }
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement