课程表
class Solution {
public:
bool canFinish(int numCourses, vector>& prerequisites)
{
int n = prerequisites.size();
// 没有依赖关系,必然能完成所有课程的学习
if (n == 0) return true;
vector indegree(numCourses); // 每个节点的入度
vector > adjacency(numCourses); // 邻接矩阵:先修课程-->(后续课程集合)
queue help; // 辅助队列,存放入度为0的节点
// 统计所有节点的入度,构建邻接矩阵
for (int i = 0; i < n; i++)
{
indegree[prerequisites[i][0]]++;
adjacency[prerequisites[i][1]].push_back(prerequisites[i][0]);//装入他的后续课程,方便以后操作减1
}
// 将所有入度为0的节点加入队列,入度为0的节点意味着没有先修课程的自由课程
for (int i = 0; i < numCourses; i++)
{
if (indegree[i] == 0)//遍历寻找入度为0的点全部放入,
help.push(i);
}
int count = 0; // 已学的课程数
while (!help.empty())//非空
{
int visited = help.front(); // 当前学习的课程
count++;//学的课程++
help.pop(); // 学完,出队
// 将刚学完的课程的所有后续课程的入度减一
for (int i = 0; i < adjacency[visited].size(); i++)
{
indegree[adjacency[visited][i]]--;//后序课程入度减少
// 发现如果有后续课程的入度减为零了,则其变为了自由课程,加入队列
if (indegree[adjacency[visited][i]] == 0)//
help.push(adjacency[visited][i]);
}
}
// 如果可以学完的课程数=课程总数则返回true,否则返回false
return count == numCourses;//