LeetCode 207 Course Schedule(基于DFS)

南笙酒味 提交于 2020-01-31 04:28:18

题目链接:点击这里
在这里插入图片描述

思路:

flag[ ]flag[\ ] 标记每一个节点的状态,00 表示没有访问过,11 表示当前的dfs正在访问,1-1 表示已经访问完毕。

对所有的节点进行遍历。比如遍历节点 aa 的时候,遍历前,先将该节点 aaflagflag 设置为 11,表示正在遍历,然后,对 aa 的邻接表进行遍历:

  1. 如果下一级节点 bbflagflag1-1,说明已经遍历了,返回 tureture
  2. 如果为 11,说明重复遍历了当前的节点,这个时候存在环,返回 falsefalse
  3. 如果为 00,则继续遍历该节点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;
    }
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!