
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
if(numCourses==0)
return false;
vector<vector<int>> edge(numCourses); // 保存边的连接信息
vector<int> index(numCourses); // 保存入度信息
for(int i = 0; i < prerequisites.size(); i++){
// 保存修完课程a, 可以修的其余所有课程
edge[prerequisites[i][1]].push_back(prerequisites[i][0]);
index[prerequisites[i][0]]++; // 入度加一
}
queue<int> q;
for(int i = 0; i < numCourses; i++){
if(index[i]==0)
q.push(i); // 将入度为0的节点加入队列
}
int res = 0;
while(!q.empty()){
vector<int> tmp;
res++;
tmp = edge[q.front()];
q.pop();
for(int i = 0; i < tmp.size(); i++){
index[tmp[i]]--; // 将与刚才弹出节点相连的节点入度全部减1
if(index[tmp[i]]==0)
q.push(tmp[i]);
}
}
if(res==numCourses)
return true;
else
return false;
}
};