题目链接
思路:
- 这题主要考查的就是拓扑排序的思想,我们可以统计每一个点的入度,同时构建起邻接矩阵。
- 先将入度为0的点存入BFS的队列中,入度为0说明该课程不是任何课程的先导课。
- 然后再对队列中的每个点的出度进行遍历,同时每遍历一次就将遍历的点的入度减1,同时将新的入度为0的点存入队列中,同时在遍历的过程中统计一共有多少个点进入过该队列中。
- 当BFS结束时,我们判断一下在遍历的过程中一共有多少个点进入过该队列中,如果所有点都进入过则输出"true",否则输出"false"。
代码:
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> G(numCourses);
vector<int> rd(numCourses,0);
int ans=0;
for(auto x:prerequisites)
{
int u=x[1];
int v=x[0];
rd[v]++;
G[u].push_back(v);
}
queue<int> q;
for(int i=0;i<rd.size();i++)
{
if(rd[i]==0)
{
q.push(i);
ans++;
}
}
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<G[x].size();i++)
{
if(rd[G[x][i]]>0)
{
rd[G[x][i]]--;
if(rd[G[x][i]]==0)
{
q.push(G[x][i]);
ans++;
}
}
}
}
return ans==numCourses;
}
};