- Course Schedule
Medium
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) {
//拓扑排序
vector<vector<int>>g(numCourses);
vector<int>indegree(numCourses,0);
for(int i=0;i<prerequisites.size();i++)
{
g[prerequisites[i][1]].push_back(prerequisites[i][0]);
indegree[prerequisites[i][0]]++;
}
return topsort(g,indegree,numCourses);
}
bool topsort(vector<vector<int>>&g,vector<int>&indegree,int numCourses)
{
int num=0;//root表示入度为0的结点,num为遍历过的结点数
queue<int>q;
for(int i=0;i<numCourses;i++)
{
if(!indegree[i])//将入度为0的结点入队,相当于删除该结点
{
q.push(i);
num++;
}
}
while(q.size())
{
int u=q.front();q.pop();
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
indegree[v]--;//与u邻接的结点入度-1
if(!indegree[v])//如果v入度为0,入队,删除结点
{
q.push(v);
num++;
}
}
}
return num==numCourses;
}
};