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.
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<set<int>> graph(numCourses);
for(auto pre:prerequisites)
graph[pre.second].insert(pre.first); //建立图
vector<int> degrees(graph.size(),0); //建立各个节点的入度
for(auto n:graph)
{
for(int neigh:n)
degrees[neigh]++;
}
for(int i=0;i<numCourses;i++) //BFS 循环numCourses次 每次便利所有的节点,能解决就是每次都能便利到一个入度为0的节点,反之不然
{
int j=0;
for(;j<numCourses;j++)
if(!degrees[j]) break;
if(j==numCourses)
return false;
degrees[j]=-1;
for(int neigh:graph[j])
degrees[neigh]--;
}
return true;
}
};