graph := make(map[int][]int, len(prerequisites)) in := make([]int, numCourses) for _, pre := range prerequisites { graph[pre[1]] = append(graph[pre[1]], pre[0]) in[pre[0]]++ }
var queue []int for i := 0; i < numCourses; i++ { if in[i] == 0 { queue = append(queue, i) } } var res []int forlen(queue) > 0 { front := queue[0] queue = queue[1:] res = append(res, front) // 将课程编号加入到结果中 for _, next := range graph[front] { in[next]-- if in[next] == 0 { queue = append(queue, next) } } }
graph := make(map[int][]int, len(prerequisites)) for _, pre := range prerequisites { graph[pre[0]] = append(graph[pre[0]], pre[1]) // key为后学的课程 } visited := make([]int, numCourses) var res []int for i := 0; i < numCourses; i++ { if !dfsFindOrder(graph, &visited, i, &res) { return []int{} } } return res }
funcdfsFindOrder(graph map[int][]int, visited *[]int, i int, res *[]int)bool { if (*visited)[i] == 0 { (*visited)[i] = 1 for k := 0; k < len(graph[i]); k++ { if !dfsFindOrder(graph, visited, graph[i][k], res) { returnfalse } } (*visited)[i] = 2 } elseif (*visited)[i] == 1 { returnfalse } else { returntrue } *res = append(*res, i) returntrue }