1+ // DFS
2+ class Solution {
3+ public:
4+ bool dfs (int curr, vector<vector<int >>& graph, vector<int >& visited){
5+ if (visited[curr] == 1 )
6+ return false ;
7+
8+ if (visited[curr] == 2 )
9+ return true ;
10+
11+ visited[curr] = 1 ;
12+
13+ for (int i = 0 ; i < graph[curr].size (); i++){
14+ if (dfs (graph[curr][i], graph, visited) == false )
15+ return false ;
16+ }
17+
18+ visited[curr] = 2 ;
19+
20+ return true ;
21+ }
22+
23+ bool canFinish (int numCourses, vector<vector<int >>& prerequisites) {
24+ vector<vector<int >> graph (numCourses);
25+ vector<int > visited (numCourses, 0 );
26+
27+ for (int i = 0 ; i < prerequisites.size (); i++){
28+ int course = prerequisites[i][0 ];
29+ int pre = prerequisites[i][1 ];
30+
31+ graph[pre ].push_back (course);
32+ }
33+
34+ for (int i = 0 ; i < numCourses; i++){
35+ if (dfs (i, graph, visited) == false )
36+ return false ;
37+ }
38+
39+ return true ;
40+ }
41+ };
42+
43+ // BFS
44+ class Solution {
45+ public:
46+ bool canFinish (int numCourses, vector<vector<int >>& prerequisites) {
47+ vector<vector<int >> graph (numCourses);
48+ vector<int > inDegree (numCourses, 0 );
49+
50+ for (int i = 0 ; i < prerequisites.size (); i++){
51+ int course = prerequisites[i][0 ];
52+ int pre = prerequisites[i][1 ];
53+
54+ graph[pre ].push_back (course);
55+ inDegree[course]++;
56+ }
57+
58+ queue<int > q;
59+
60+ for (int i = 0 ; i < numCourses; i++){
61+ if (inDegree[i] == 0 )
62+ q.push (i);
63+ }
64+
65+ int count = 0 ;
66+
67+ while (!q.empty ()){
68+ int curr = q.front ();
69+ q.pop ();
70+ count++;
71+
72+ for (int i = 0 ; i < graph[curr].size (); i++){
73+ if (--inDegree[graph[curr][i]] == 0 )
74+ q.push (graph[curr][i]);
75+ }
76+ }
77+
78+ return count == numCourses;;
79+ }
80+ };
0 commit comments