-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathsolution.go
39 lines (34 loc) · 1011 Bytes
/
solution.go
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
36
37
38
39
func eventualSafeNodes(graph [][]int) []int {
n := len(graph)
reversedGraph := make([][]int, n)
inDegree := make([]int, n)
// Reverse the graph and calculate in-degree
for i := 0; i < n; i++ {
for _, neighbor := range graph[i] {
reversedGraph[neighbor] = append(reversedGraph[neighbor], i)
inDegree[i]++
}
}
// Find all terminal nodes
queue := []int{}
for i := 0; i < n; i++ {
if inDegree[i] == 0 {
queue = append(queue, i)
}
}
// Topological sorting to find safe nodes
safeNodes := []int{}
for len(queue) > 0 {
node := queue[0]
queue = queue[1:]
safeNodes = append(safeNodes, node)
for _, neighbor := range reversedGraph[node] {
inDegree[neighbor]--
if inDegree[neighbor] == 0 {
queue = append(queue, neighbor)
}
}
}
sort.Ints(safeNodes)
return safeNodes
}