题目描述:具体描述见原题,简单来说就是检查拓扑图中是否有环路。
解题思路:找到入度为0的点,删除该点以及该顶点连接的所有出边,记录删除顶点数。重复上述步骤,循环结束后,判断删除顶点数是否小于给定顶点数,如果不等于,则存在环路。具体过程见代码。
具体代码:
func canFinish(numsCourses int, prerequisites [][]int) bool {
in := make([]int, numsCourses) // 记录每个点入度
links := make([][]int, numsCourses) // 记录每个点连接的出边
next := make([]int, 0) // 记录入度为0的点
for _, p := range prerequisites{ // 初始化入度及出边
in[p[0]]++
links[p[1]] = append(links[p[1]], p[0])
}
for i, v := range in { // 初始化入度为0的点
if v == 0 {
next = append(next, i)
}
}
for i := 0; i < len(next); i++ {
n := next[i]
l := links[n]
for _, t := range l{
in[t]-- // 删除入度为0的点出边,出边相邻的点入度-1即可代表删除该点
if in[t] == 0 {
next = append(next, t)
}
}
}
return len(next) == numsCourses // 判断删除点数目是否等于初始网中顶点数目
}
补充说明:这是一道标准AOV网拓扑排序为题,我个人更喜欢AOE。