Leetcode 207. Course Schedule 关于拓扑排序的纯BFS和DFS解法

BFS

  • 思路
    • 找这个图有没有环
    • BFS遍历的过程是:不断将入读为0的点加入到队列中,
    • 如果没有环的话,那么最终入队的点的总个数应该等于图上的所有结点数
class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> neighbour(numCourses);
        vector<int> degree(numCourses, 0);
        int count = 0;
        queue<int> q;
        
        for(auto& i: prerequisites){
            degree[i[0]]++;
            neighbour[i[1]].push_back(i[0]);
        }
        
        for(int i=0;i<numCourses; i++)
            if(degree[i]==0){
                count++;
                q.push(i);
            }
        
        while(!q.empty()){
            int cur = q.front();
            q.pop();
            for(int i: neighbour[cur]){
                degree[i]--;
                if(degree[i]==0){
                    q.push(i);
                    count++;
                }
            }
            
        }
        if(count==numCourses) return true;
        return false;
        
    }
};

DFS

  • 状态量为三个:0:unknown 1:visiting 2:visited
  • 当一次dfs搜索过程中碰到了visiting,说明有环,那么就返回false
class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
      
        graph_ = vector<vector<int>>(numCourses);
        
        for( auto& p: prerequisites){
            graph_[p[1]].push_back(p[0]);
        }
        // 0:unknown 1:visiting  2:visited 
        vector<int> v(numCourses, 0);
        for(int i=0; i<numCourses; i++)
            if(!dfs(i, v)) return false;
        return true;
      
    }
private:
    vector<vector<int>> graph_;
    bool dfs(int cur, vector<int>& v){
        if(v[cur] == 1) return false;
        if(v[cur] == 2) return true;
        
        v[cur] = 1;
        
        for(int i: graph_[cur])
            if(!dfs(i, v)) return false;
        
        v[cur] = 2;
        
        return true;
        
    }
};

参考-lq discuss

猜你喜欢

转载自blog.csdn.net/Xurui_Luo/article/details/106839034