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
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
// 判断有向图是否有环 拓扑排序 [a, b] b->a 代表b完成才能进行a 核心是搞清前驱后继关系
vector<vector<int>> g(numCourses, vector<int>(numCourses, 0));
vector<int> degreeIn(numCourses, 0);
for(auto &p : prerequisites){
g[p.second][p.first] = 1;
++degreeIn[p.first];
}
// 统计入度 入度为0的节点入栈
stack<int> s;
for(int i=0;i<numCourses;i++){
if(degreeIn[i] == 0)
s.push(i);
}
// 每次出栈一个入度为0节点,相邻节点入度-1 如果为零就入栈
while(!s.empty()){
int tmp = s.top();
s.pop();
for(int j=0;j<numCourses;j++){
if(g[tmp][j] == 1){
if(--degreeIn[j] == 0) s.push(j);
}
}
}
// 最后如果有节点入度不为零就有环
for(int i=0;i<numCourses;i++)
if(degreeIn[i] != 0) return false;
return true;
}
};