课程表 - 拓扑排序(广度优先)

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
}