课程表 - 拓扑排序(广度优先)
func canFinish(numCourses int, prerequisites [][]int) bool {
// 邻接表
deges := make([][]int, numCourses)
// 入度表
indeg := make([]int, numCourses)
// 入度为 0 的节点数量
cnt := 0
for _, item := range prerequisites {
deges[item[1]] = append(deges[item[1]], item[0])
indeg[item[0]]++
}
queue := []int{}
for i, item := range indeg {
if item == 0 {
queue = append(queue, i)
}
}
for len(queue) > 0 {
size := len(queue)
cnt += size
for i := 0; i < size; i++ {
for _, item := range deges[queue[i]] {
indeg[item]--
if indeg[item] == 0 {
queue = append(queue, item)
}
}
}
queue = queue[size:]
}
return cnt == numCourses
}