forked from TheAlgorithms/Go
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtopological.go
More file actions
35 lines (31 loc) · 758 Bytes
/
topological.go
File metadata and controls
35 lines (31 loc) · 758 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package graph
// Assumes that graph given is valid and possible to
// get a topo ordering.
// constraints are array of []int{a, b}, representing
// an edge going from a to b
func Topological(N int, constraints [][]int) []int {
dependencies := make([]int, N)
nodes := make([]int, N)
for i := range nodes {
nodes[i] = i
}
edges := make([][]bool, N)
for i := range edges {
edges[i] = make([]bool, N)
}
for _, c := range constraints {
a := c[0]
b := c[1]
dependencies[b]++
edges[a][b] = true
}
answer := []int{}
for s := 0; s < N; s++ {
// Only start walking from top level nodes
if dependencies[s] == 0 {
route, _ := DepthFirstSearchHelper(s, N, nodes, edges, true)
answer = append(answer, route...)
}
}
return answer
}