go: add «2192. All Ancestors of a Node in a Directed Acyclic Graph»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
c56b3d121b
commit
92c5bae5aa
1 changed files with 34 additions and 0 deletions
34
go/all-ancestors-of-a-node-in-a-directed-acyclic-graph.go
Normal file
34
go/all-ancestors-of-a-node-in-a-directed-acyclic-graph.go
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
func getAncestors(n int, edges [][]int) [][]int {
|
||||||
|
fromEdges := func() [][]int {
|
||||||
|
neighbours := make([][]int, n)
|
||||||
|
|
||||||
|
for _, edge := range edges {
|
||||||
|
u, v := edge[0], edge[1]
|
||||||
|
neighbours[u] = append(neighbours[u], v)
|
||||||
|
}
|
||||||
|
|
||||||
|
return neighbours
|
||||||
|
}
|
||||||
|
|
||||||
|
neighbours := fromEdges()
|
||||||
|
ancestors := make([][]int, n)
|
||||||
|
|
||||||
|
var dfs func(int, int)
|
||||||
|
dfs = func(ancestor, node int) {
|
||||||
|
for _, next := range neighbours[node] {
|
||||||
|
vertices := ancestors[next]
|
||||||
|
if len(vertices) == 0 || vertices[len(vertices)-1] != ancestor {
|
||||||
|
ancestors[next] = append(ancestors[next], ancestor)
|
||||||
|
dfs(ancestor, next)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range n {
|
||||||
|
dfs(i, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ancestors
|
||||||
|
}
|
Loading…
Reference in a new issue