题目:207. 课程表
写题思路:
- 这是一题典型的拓扑排序
- 首先,我们根据题目意思,将课程关系做成邻接矩阵,并保存每个课程的入度
- 再创建队列,保存入读为零的课程名,
- 进入循环(退出条件是队列里没有元素)
- count 计数,u 保存队头元素,并将队头元素pop,再接着把将u作为先修课的课程indeg–,
- 最后判断count 与numCourses 的比较
源代码
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> edges;
vector<int> indeg;
edges.resize(numCourses);
indeg.resize(numCourses);
for(const auto& a : prerequisites){
edges[a[1]].push_back(a[0]);
++indeg[a[0]];
}
queue<int> q;
for(int i = 0; i < numCourses; ++i){
if(indeg[i] == 0){
q.push(i);
}
}
int vidited = 0;
while(!q.empty()){
++vidited;
int u = q.front();
q.pop();
for(int i : edges[u]){
--indeg[i];
if(indeg[i] == 0){
q.push(i);
}
}
}
return vidited == numCourses;
}
};