Leetcode 207 - Course Schedule

題目

Problem#

給你一個正整數 $n$ 代表課程數量(從 0`` 到 n-1),並給你一個 prerequisites[i] = [a_i, b_i] (int[m][2])的陣列,代表如果要上課程b_i,一定要先上課程 a_i`
問你能不能上完所有課程?

測資限制#

  • $1 \le n \le 2000$
  • $0 \le m \le 5000$
  • $(a_i, b_i)$ 不重複

想法#

觀察一下可以發現(第二個 example),如果課程存在循環依賴,則無法完成所以有課程,反之,不存在環則一定可以完成
=> 把 prerequisites 轉成 graph,接著用找環的演算法即可。

DFS 塗顏色,一開始全部都白色(0),接著開始 dfs,遇到白色的點就塗上紅色(1),如果在 dfs 的過程遇到紅色(1)的點,代表存在環。
為了要枚舉 n 個點當起點去 dfs ,所以如果點 i 的邊都 dfs 完了,則把點 i 塗成藍色(2),之後找沒有塗過的點(白色0)去 dfs

  • 時間複雜度: $\mathcal{O}(n+m)$
  • 空間複雜度: $\mathcal{O}(n)$

AC Code#

賞析#

https://cp-algorithms.com/graph/finding-cycle.html