[LeetCode] 207. Course Schedule

来源:互联网 发布:网络变压器品牌 编辑:程序博客网 时间:2024/06/07 19:01

There are a total of n courses you have to take, labeled from 0 to n - 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?

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]

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.

Note:
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.
click to show more hints.

Hints:
This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
Topological sort could also be done via BFS.

// 本质上就是有向图中的有向环检测class Solution {public:    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {        if (prerequisites.size() < 2) return true;        vector<vector<int>> adjs(numCourses);        for (auto& prerequisite : prerequisites)            adjs[prerequisite.second].push_back(prerequisite.first);        HasCyclc = false;        marked = vector<bool>(numCourses, false);        OnStack = vector<bool>(numCourses, false);        for (int i = 0; i < marked.size(); i++)            if (!marked[i]) DFS(adjs, i);        return !HasCyclc;    }private:    bool HasCyclc;    vector<bool> marked;    vector<bool> OnStack;    void DFS(vector<vector<int>>& adjs, int v) {        marked[v] = true;        OnStack[v] = true;        for (auto w : adjs[v]) {            if (HasCyclc) return;            else if (!marked[w])DFS(adjs, w);            else if (OnStack[w]) HasCyclc = true;        }        OnStack[v] = false;    }};

这里写图片描述这里写图片描述

原创粉丝点击