在有向图中利用拓扑排序的思想判断是否有环路即可:在有向图中,找到一个入度为0的节点,删除该节点与邻居节点之间的有向边;重复上述步骤,直到找不到入度为0的新节点即可;若此时仍存在节点的入度非0,那么有向图中即存在环路。
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<vector<int>> graph(numCourses,vector<int>(0)); //构造邻接表来表示图
vector<int> inDgree(numCourses,0); //存储各节点的入度
queue<int> zeroNode; //存储入度为0的节点
for(auto item:prerequisites)
{
graph[item.second].push_back(item.first); //一条有向边
inDgree[item.first]++;
}
for (int i = 0;i<inDgree.size();i++)
{
if(inDgree[i]==0)
zeroNode.push(i); //入度为0的节点加入队列
}
while(zeroNode.size()>0)
{
int flag=zeroNode.front();
zeroNode.pop(); //选择一个入度为0的节点
for(auto item:graph[flag])
{
inDgree[item]--; //删除该节点与邻居节点之间的有向边
if(inDgree[item]==0)
zeroNode.push(item);
}
}
for(auto item : inDgree)
if(item!=0)
return false; //判断是否存在入度非零的剩余节点
return true;
}
};