207. Course Schedule
Medium
186890FavoriteShare
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?
Example 1:
Input: 2, [[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: 2, [[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.
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.
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
int x, y;
vector<int> cur;
vector<bool>visited(numCourses, false);
vector<vector<int> > v(numCourses, cur);
vector<int> In_degree(numCourses, 0);
for (int i = 0; i < prerequisites.size(); i++)
{
v[prerequisites[i][1]].push_back(prerequisites[i][0]);
In_degree[prerequisites[i][0]]++;
}
int cnt = 0;
//找入度 = 0 的节点
bool has_0 = false;
while (true) {
has_0 = false;
for (int i = 0; i < numCourses; i++)
{
if (!visited[i] && In_degree[i] == 0) {
has_0 = true;
visited[i] = true;
cnt++;
for (int j = 0; j < v[i].size(); j++)
{
In_degree[v[i][j]]--;
}
}
}
if (!has_0&&cnt<numCourses) {
return false;
}
if (has_0&&cnt == numCourses)
break;
}
return true;
}
};