Leetcode_207. 课程表I+II(拓扑排序)

目录

207. 课程表 M

210. 课程表 II


207. 课程表 M

你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]

给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?

示例 1:
输入: 2, [[1,0]] 
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

示例 2:
输入: 2, [[1,0],[0,1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。

提示:
输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。
你可以假定输入的先决条件中没有重复的边。
1 <= numCourses <= 10^5

 长见识了,dfs还可以这么玩!

class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
    graph=vector<vector<int>>(numCourses);
     for(auto tmp:prerequisites)
        graph[tmp[1]].push_back(tmp[0]);
        ///0->unkonwn 1->visiting 2=visted 
     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; //[0,1] 1->0 
    bool dfs(int cur,vector<int> &v){
        if(v[cur]==1) return true;
        if(v[cur]==2) return false;
        v[cur]=1;
        for(auto x:graph[cur]){
            if(dfs(x,v)) return true;
        }
        v[cur]=2;
        return false;
    }

};

BFS 20.79% 88.78%

class Solution {
    public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites){
    vector<vector<int>> graph(numCourses);
    vector<int> indegree(numCourses,0);
    for(auto tmp:prerequisites){
        graph[tmp[1]].push_back(tmp[0]);
        indegree[tmp[0]]++;
    }
    queue<int> qu;
    for(int i=0;i<numCourses; i++){
        if(indegree[i]==0) qu.push(i);
    }
    int num=0;
    while(!qu.empty()){
        int cur=qu.front();qu.pop();
        for(int i=0;i<graph[cur].size();i++){
            int child=graph[cur][i];
            indegree[child]--;
            if(indegree[child]==0) qu.push(child);
        }
        num++;
    }
    return num==numCourses;
   }
};

210. 课程表 II

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        graph=vector<vector<int>>(numCourses);
        for(auto tmp:prerequisites)
            graph[tmp[1]].push_back(tmp[0]);
        vector<int> v(numCourses,0);
        for(int i=0;i<numCourses;i++){
            if(dfs(i,v)) return {};
        }
        
        int tmp,n=numCourses;
        for(int i=0;i<n/2;i++) {
            tmp=res[i]; res[i]=res[n-i-1];res[n-i-1]=tmp;
        }   
        return res;
    }
private:
    vector<int> res;
    vector<vector<int>> graph; //[0,1] 1->0 

    bool dfs(int cur,vector<int> &v){
        if(v[cur]==1) return true;
        if(v[cur]==2) return false;
        v[cur]=1;
        for(auto x:graph[cur]){
            if(dfs(x,v)) return true;
            //res.push_back(x);
        }
        res.push_back(cur);
        v[cur]=2;
        return false;
    }
}; 
扫描二维码关注公众号,回复: 10605142 查看本文章
发布了88 篇原创文章 · 获赞 77 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43107805/article/details/105209436