题目描述
连续轰炸四五天了,天天都是课程表
解法
一眼定阵,鉴定为邻接矩阵,我的思路是这样的
- 初始化一个 numCourses * numCourses 大小的邻接矩阵 和判断是否联通的bool矩阵
- 选取入度为0的节点加入队列
- pop 队列,根据这个值生成它联通的节点,和它联通节点的字节点,将bool矩阵的对应节点设为true
- 其所有子节点的入度 -1
- 循环至步骤2
代码
func checkIfPrerequisite(numCourses int, prerequisites [][]int, queries [][]int) []bool {
var (
matrix = make([][]bool, numCourses) // bool矩阵
indegree = make([]int, numCourses) // 邻接矩阵
q = make([][]int, numCourses) // 记录某节点的字节点队列
)
for i, _ := range matrix {
matrix[i] = make([]bool, numCourses)
q[i] = []int{} //初始化操作
}
for _, v := range prerequisites {
q[v[0]] = append(q[v[0]], v[1]) // 把v[1]保存在v[0]的字节点队列中
indegree[v[1]]++ // v[1]的入度+1
}
zeroQ := []int{} // 保存入度为0的节点
for k, v := range indegree {
if v == 0 {
zeroQ = append(zeroQ, k) // 找到所有入度为0的节点
}
}
for len(zeroQ) > 0 {
cur := zeroQ[0]
zeroQ = zeroQ[1:] // cur 出队
for _, ne := range q[cur] { // 遍历cur的字节点
matrix[cur][ne] = true // bool矩阵会把 cur 和字节点ne 单向设置为true
for i := 0; i < numCourses; i++ {
matrix[i][ne] = matrix[i][ne] || matrix[i][cur] // 这一步会把cur的父节点和cur的字节点设置为true
}
indegree[ne]-- // 入度-1
if indegree[ne] == 0 {
zeroQ = append(zeroQ, ne) //循环前面步骤
}
}
}
res := []bool{}
for _, q := range queries {
res = append(res, matrix[q[0]][q[1]]) // 返回bool矩阵中的结果
}
return res
}