| 88 | } |
| 89 | |
| 90 | func (g Graph) findAllCyclesHelper(current int, all, visiting, visited map[int]struct{}) (bool, [][]int) { |
| 91 | parents := [][]int{} |
| 92 | |
| 93 | delete(all, current) |
| 94 | visiting[current] = struct{}{} |
| 95 | |
| 96 | neighbors := g.edges[current] |
| 97 | for v := range neighbors { |
| 98 | if _, ok := visited[v]; ok { |
| 99 | continue |
| 100 | } else if _, ok := visiting[v]; ok { |
| 101 | parents = append(parents, []int{v, current}) |
| 102 | return true, parents |
| 103 | } else if ok, savedParents := g.findAllCyclesHelper(v, all, visiting, visited); ok { |
| 104 | parents = append(parents, savedParents...) |
| 105 | parents = append(parents, []int{v, current}) |
| 106 | return true, parents |
| 107 | } |
| 108 | } |
| 109 | delete(visiting, current) |
| 110 | visited[current] = struct{}{} |
| 111 | return false, parents |
| 112 | } |