# 【LeetCode】 207. Course Schedule ## Description > There are a total of `numCourses` courses you have to take, labeled from `0` to `numCourses-1`. > Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: `[0,1]` > Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses? > Constraints: > * The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented. > * You may assume that there are no duplicate edges in the input prerequisites. > * `1 <= numCourses <= 10^5` > 你選了總共`numCourses`堂的課程,將它們標記為 `0` 到 `numCourses-1`。 > 有些課程有擋修,例如你需要先修課程 1 才能修課程 0 ,這被表示成一個對子:`[0,1]` > 給予課程的總數和一個擋修表,判斷是否可能完成所有課程。 > 限制: > * 輸入的擋修表使用邊的列表(list of edges)表示法,而不是鄰近矩陣(adjacency matrices),查閱更多圖的表示法來得到更多相關知識。 > * 你可以假設擋修表不會有重複的邊。 > * `1 <= numCourses <= 10^5` ## Example: ``` Example 1: Input: numCourses = 2, prerequisites = [[1,0]] Output: true Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible. Example 2: Input: numCourses = 2, prerequisites = [[1,0],[0,1]] Output: false Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible. ``` ## Solution * 先提一下,很久沒寫graph相關的東西,有些生疏,code應該可以精簡很多(我的執行時間很醜)。 * 這一題可以把擋修關係畫成有向圖,然後只要檢查圖是否有cycle就是答案。 * 對於graph不熟或是還沒學過的朋友,可以去看我的[資料結構筆記](https://hackmd.io/@Zero871015/DSNote)`16、17`章喔~ * 檢查cycle的方式,我這邊是從每個點去跑DFS,如果過程中跑回自己就代表有cycle。 * 感覺好像在這個部分會有跑重複的部分,但我不知道怎麼改寫演算法。 ### Code ```C++=1 class Solution { public: bool getSelf(int now, int vertex, vector<bool>& touched) { touched[now] = true; for(auto next : graph[now]) { if(next == vertex) return true; if(touched[next] == false) { if(getSelf(next, vertex, touched)) return true; } } return false; } bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { /* Build graph */ graph = vector<vector<int>>(numCourses); for(int i = 0; i < prerequisites.size(); i++) graph[prerequisites[i][1]].push_back(prerequisites[i][0]); /* Check the graph has a circle or not */ /* Check each vertex can get itself or not */ for(int i = 0; i < numCourses; i++) { vector<bool> touched(numCourses, false); if(getSelf(i, i, touched) == true) return false; } return true; } private: vector<vector<int>> graph; }; ``` ###### tags: `LeetCode` `C++`