//[[1,0]]表示学1之前要先学0
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> vec(numCourses);//记录所有顶点的入度,未初始化的为0 // degrees(numCourses)声明并初始化为numC 个0
vector<vector<int>> ans(numCourses); //邻接表
queue<int> q;//零入度的顶点
int num = numCourses;
for (int i = 0; i < prerequisites.size(); i++) {
vec[prerequisites[i][0]]++;//入顶点vec[i] 表示课程i有vec[i]门前驱
ans[prerequisites[i][1]].push_back(prerequisites[i][0]);//出顶点 ans[i]表示课程i 有若干后继分别是ans[i][0]到ans[i][n]
}//ans[0]push进一个1;表示 课程0有1个初度指向课程1
for (int i = 0; i < numCourses; i++)
if (vec[i] == 0) {//课程i没有前驱
q.push(i); //入度为0的先入队列
num--;
}
while (!q.empty()) {
int temp = q.front();
q.pop();//学习目前没有前驱的课程
for (int j = 0; j < ans[temp].size(); j++)//ans[temp].size()表示课程temp有ans[temp].size()个后继
if (--vec[ans[temp][j]] == 0) {//即课程ans[temp][j] 的前驱是否为0
q.push(ans[temp][j]);
num--;
}
}
if (num == 0)
return true;
return false;
}
};