leetcode-207

85 阅读1分钟

题目描述:具体描述见原题,简单来说就是检查拓扑图中是否有环路。

解题思路:找到入度为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。