Advertisement
Ladies_Man

Orgraph base (База орграфа)

Jun 9th, 2014
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.16 KB | None | 0 0
  1. package main
  2. import "github.com/skorobogatov/input"
  3. import "fmt"
  4. import "math"
  5. import "os"
  6.  
  7. type vertex struct {
  8.         posx, indx, comp, T1, low int
  9.     next                      *vertex
  10. }
  11.  
  12. type edge struct {
  13.         x int
  14.     u, v *vertex
  15.     p    *vertex
  16.     next *edge
  17. }
  18.  
  19. type stack struct {
  20.     data       []int
  21.     top        interface{}
  22.     cap, count int
  23. }
  24.  
  25. var n, m, time, count int
  26. var G []vertex
  27. var E []edge
  28.  
  29. func abs(x int) int {
  30.         if x < 0 { return -x }
  31.         return x  
  32. }
  33.  
  34. func InitStack(size int) *stack {
  35.     var s stack
  36.     s.data = make([]int, size)
  37.     s.cap = size
  38.     s.count = 0
  39.     s.top = nil
  40.     return &s
  41. }
  42.  
  43. func (s *stack) StackEmpty() bool { return s.top == 0 }
  44.  
  45. func (s *stack) Push(value int) {
  46.     if s.top == s.cap { fmt.Printf("overflow\n") }
  47.     s.data = append(s.data, value)
  48.     s.count++
  49. }
  50.  
  51. func (s *stack) Pop() interface{} {
  52.     if s.StackEmpty() { fmt.Printf("devastation\n") }
  53.     ret := s.data[len(s.data)-1]
  54.     s.data = s.data[0 : len(s.data)-1]
  55.     s.count--
  56.     return ret
  57. }
  58.  
  59. func Mark(a []int, b [][]int, c []vertex) { if 0 != len(a) && 0 != len(b) { for i := range c { c[i].comp, c[i].T1 = 0, 0 } } else { for i := range b { for j := range b { b[i][j] = (int)(math.Inf(1)) } } } }
  60.  
  61. func (s *stack) VisitVertex_Tarjan(v *vertex) {
  62.     v.low, v.T1 = time, time
  63.     time++
  64.     s.Push(v.posx)
  65.     for x := v.next; x != nil; x = x.next {
  66.         if G[x.indx].posx = x.indx; 0 == G[x.indx].T1 { s.VisitVertex_Tarjan(&G[x.indx]) }
  67.         if 0 == G[x.indx].comp && v.low > G[x.indx].low { v.low = G[x.indx].low }
  68.     }
  69.     if v.T1 == v.low {
  70.         u := s.Pop().(int)
  71.         G[u].comp = count
  72.         for u != v.posx {
  73.             u = s.Pop().(int)
  74.             G[u].comp = count
  75.         }
  76.         count++
  77.     }
  78. }
  79.  
  80. func nless2(num int) bool {
  81.         if 0 == num { os.Exit(1) }
  82.     if 1 == num { fmt.Printf("0\n"); return false
  83.     } else { return true }
  84.         return true
  85. }
  86.  
  87. func main() {
  88.     var u, v, f int
  89.         time, count = 1, 1
  90.     input.Scanf("%d\n%d\n", &n, &m)
  91.         if z := nless2(n); !(z) { os.Exit(0) }
  92.     stack := InitStack(f)
  93.     tmp1 := make([]int, 0)
  94.     tmp2 := make([][]int, 0)
  95.     res := make([]int, n+m)
  96.         c := make([][]int, 0)
  97.     G = make([]vertex, n)
  98.     for i := 0; i < m; i++ {
  99.         input.Scanf("%d %d\n", &u, &v)
  100.         if G[u].next == nil {
  101.             G[u].next = new(vertex)
  102.             G[u].next.indx, G[u].next.next = v, nil
  103.             continue
  104.         }
  105.         next := G[u].next
  106.         for next.next != nil { next = next.next }
  107.         next.next = new(vertex)
  108.     }
  109.     Mark(tmp1, tmp2, G)
  110.     for i := range G { if G[i].posx = i; 0 == G[i].T1 { stack.VisitVertex_Tarjan(&G[i]) } }
  111.     for i := range G {  G[i].comp, E[i].x = G[i].comp-1, E[i].x-1 }
  112.     for i := 0; i < count-1; i++ {
  113.         p := make([]int, count-1)
  114.         c = append(c, p)
  115.         Mark(tmp1, c, G)
  116.     }
  117.     for i := range tmp1 { tmp1[i] = 0 }
  118.     for i := 0; i < n; i++ {
  119.         a := G[i].comp
  120.         for v := G[i].next; v != nil; v = v.next { if a != G[v.indx].comp { c[a][G[v.indx].comp] = 1 } }
  121.     }
  122.     for i := 0; i < abs(count-1); i++ {
  123.         r, k := 0, 0
  124.         for j := 0; j < abs(count-1); j++ { if (int)(math.Inf(1)) != c[j][i] { r += c[j][i] } }
  125.         if 0 == r {
  126.             for k < n {
  127.                 if G[k].comp == i {
  128.                     res[f], f = k, f+1
  129.                     break
  130.                 }
  131.                 k++
  132.             }
  133.         }
  134.     }
  135.     for i := 0; i < f; i++ { fmt.Printf("%d ", res[i]) }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement