Thursday, September 3, 2020

207. Course Schedule

 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?

 

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.

 

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

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        // Check cycle.
        vector<vector<int>> graph = vector<vector<int>>(numCourses, vector<int>());
        
        for (auto prereq : prerequisites) {
            graph[prereq[0]].push_back(prereq[1]);
        }
        
        vector<int> graph_state = vector<int>(numCourses, 0);
        
        for (int node = 0; node < numCourses; node++) {
            if (graph_state[node] == 0 && cycle(graph, graph_state, node)) {
                return false;
            }
        }
        return true;
    }
    
    // DFS.
    bool cycle(vector<vector<int>>& graph, vector<int>& state, int node) {
        if (state[node] == 2) {
            return false;
        }
        if (state[node] == 1) {
            return true;
        }
        state[node] = 1;
        for (auto neighbor : graph[node]) {
            if (cycle(graph, state, neighbor)) {
                return true;
            }
        }
        state[node] = 2;
        return false;
    }
};

No comments:

Post a Comment