
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> edge;
vector<int> index;
edge.resize(numCourses); // resize()操作:创建指定数量的的元素并指定vector的存储空间
index.resize(numCourses);
for(int i = 0; i < prerequisites.size(); i++){
edge[prerequisites[i][1]].push_back(prerequisites[i][0]);
// [0,1] 构成边1->0 代表修完课程1才能修课程0
index[prerequisites[i][0]]++;
// 课程0的入度加1
}
queue<int> q;
for(int i = 0; i < numCourses; i++){
// 如果课程的入度为0,则加入队列
if(index[i]==0)
q.push(i);
}
int res = 0;
while(!q.empty()){
res++;
int tmp = q.front(); // 获得队头元素
q.pop(); // 弹出队头元素
vector<int> vec;
vec = edge[tmp]; // 获得队头元素连接的其余所有顶点
for(int i = 0; i < vec.size(); i++){
index[vec[i]]--; // 其余顶点的入度剪1
if(index[vec[i]]==0)
q.push(vec[i]); // 如果其余顶点的入度为0,则加入队列
}
}
if(res==numCourses) // 如果出队的元素个数等于课程个数,则返回true
return true;
else
return false;
}
};