题目链接:点击这里
思路:
用 标记每一个节点的状态, 表示没有访问过, 表示当前的dfs正在访问, 表示已经访问完毕。
对所有的节点进行遍历。比如遍历节点 的时候,遍历前,先将该节点 的 设置为 ,表示正在遍历,然后,对 的邻接表进行遍历:
- 如果下一级节点 的 为 ,说明已经遍历了,返回 ;
- 如果为 ,说明重复遍历了当前的节点,这个时候存在环,返回 ;
- 如果为 ,则继续遍历该节点b的邻接表节点。
class Solution {
public:
bool dfs(int v, vector<vector<int>>& graph, vector<int>& flag)
{
if(flag[v] == 1) return false;
if(flag[v] == -1) return true;
flag[v] = 1;
for(auto it : graph[v])
if(!dfs(it, graph, flag))
return false;
flag[v] = -1;
return true;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> flag(numCourses, 0); //初始化为没有访问过
vector<vector<int>> graph(numCourses);
for(auto it : prerequisites)
graph[it[1]].emplace_back(it[0]);
for(int i = 0; i < graph.size(); i++)
if(!dfs(i, graph, flag))
return false;
return true;
}
};
来源:CSDN
作者:菜是原罪QAQ
链接:https://blog.csdn.net/qq_42815188/article/details/104114879