
一、题目描述

二、算法原理
思路:拓扑排序

入度:指向该数字的个数
出度:箭尾的个数
拓扑排序:步步的把入度为 0 的值移除或记录下来:


最移除或记录完所有的节点,如果:

想这种没有节点的入度为 0 的,就跟题目说的:永远都是学不完,进入了一个死循环;
三、代码实现
cpp
class Solution {
public:
bool canFinish(int n, vector<vector<int>>& prerequisites) {
vector<vector<int>> edgs(n);//链接表
vector<int> in(n);//入度的值
for(auto& e : prerequisites)//建图
{
int a = e[0], b = e[1];// b -> a
//b 的入度为0, a 的入度为 1
edgs[b].push_back(a);//加入链接表
in[a]++;
}
queue<int> que;//拓扑排序
for(int i = 0; i < n; i++)
{
if(in[i] == 0)
que.push(i);//找到入度为0的值入队列,为后面的 BFS 做准备
}
//使用 BFS
while(que.size())
{
int target = que.front();//此时拿到的是度为0的值的下标
que.pop();
for(auto& e : edgs[target])//断开指向
{
in[e]--;
if(in[e] == 0) que.push(e);
}
}
for(auto& e : in)//如果度不为0,证明还有指向,也就是学习的课程呈现一个死循环,学不完
{
if(e != 0) return false;
}
return true;
}
};