-
Notifications
You must be signed in to change notification settings - Fork 56
Expand file tree
/
Copy pathtopo.go
More file actions
45 lines (39 loc) · 789 Bytes
/
topo.go
File metadata and controls
45 lines (39 loc) · 789 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
36
37
38
39
40
41
42
43
44
45
package graph
import (
"DSGO/linkedlist/deque"
"errors"
)
//输入邻接表,返回拓扑序列
func TopologicalSort(roads [][]int) ([]int, error) {
size := len(roads)
list := make([]int, 0, size)
book := make([]int, size)
// for i := 0; i < size; i++ {
// book[i] = 0
// }
for i := 0; i < size; i++ {
for _, next := range roads[i] {
book[next]++ //标记存在几个上游
}
}
free := deque.NewQueue[int]()
for i := 0; i < size; i++ {
if book[i] == 0 {
free.Push(i) //最上游点
}
}
for !free.IsEmpty() {
curr := free.Pop()
for _, next := range roads[curr] {
book[next]--
if book[next] == 0 {
free.Push(next)
}
}
list = append(list, curr)
}
if len(list) != size {
return nil, errors.New("loops exist")
}
return list, nil
}