kosaraju_s_algorithm.sf 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Kosaraju
  4. #
  5. func korasaju(Array g) {
  6. # 1. For each vertex u of the graph, mark u as unvisited. Let L be empty.
  7. var vis = g.len.of(false)
  8. var L = []
  9. var x = g.end
  10. var t = g.len.of { [] }
  11. # Recursive
  12. func visit(u) {
  13. if (!vis[u]) {
  14. vis[u] = true
  15. g[u].each {|v|
  16. visit(v)
  17. t[v] << u
  18. }
  19. L[x--] = u
  20. }
  21. }
  22. # 2. For each vertex u of the graph do visit(u)
  23. g.range.each {|u|
  24. visit(u)
  25. }
  26. var c = []
  27. # 3. Recursive subroutine:
  28. func assign(u, root) {
  29. if (vis[u]) {
  30. vis[u] = false
  31. c[u] = root
  32. t[u].each {|v|
  33. assign(v, root)
  34. }
  35. }
  36. }
  37. # 3. For each element u of L in order, do assign(u, u)
  38. L.each {|u|
  39. assign(u, u)
  40. }
  41. return c
  42. }
  43. var g = [[1], [2], [0], [1, 2, 4], [3, 5], [2, 6], [5], [4, 6, 7]]
  44. var c = korasaju(g)
  45. say c
  46. assert_eq(c, [0, 0, 0, 3, 3, 5, 5, 7])