题目链接:https://leetcode-cn.com/problems/course-schedule/description/
拓扑排序详解:https://blog.csdn.net/Q_M_X_D_D_/article/details/84862081
本题大意是给一个图,判断图中是否有环路。用bfs的思想来进行拓扑排序。基本思路是统计图中所有点的出度,然后动态维护一个入度为0的顶点的队列,遍历队列中的每个点,去掉图中从该点出发的边,同时将该边的终点的入度-1,若终点的入度为0则加入队列。当队列为空时判断图中是否还有边。代码如下:
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
int res=prerequisites.size();
queue<int> q;
vector<int> in(numCourses,0);
//统计每个点的入度
for(int i=0;i<prerequisites.size();i++)
in[prerequisites[i].first]++;
//将入度为0的点入队
for(int i=0;i<in.size();i++)
if(in[i]==0)
q.push(i);
while(!q.empty())
{
//取出一个点,bfs的思想体现在这里
int s=q.front();
q.pop();
//去掉以该点为起点的边
for(int i=0;i<prerequisites.size();i++)
{
if(prerequisites[i].second==s)
{
res--;//res--表示去掉了这条边
//终点的入度-1
if(--in[prerequisites[i].first]==0)
q.push(prerequisites[i].first);
}
}
}
return res==0;
}
};