Course Schedule (I & II)

有向图,尽量用BFS去做,明确,而且不stack overflow。(有向图,不选Union Find)

Course Schedule II

BFS, BFS的有向图建立indegree vector来做。无向图不行,无向图需要用set,来删除节点。

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<int> ret;
        vector<vector<int>> graph(numCourses, vector<int>());
        vector<int> in(numCourses, 0);
        for(auto it : prerequisites){
            graph[it.second].push_back(it.first);
            in[it.first]++;
        }
        queue<int> q;
        for(int i=0; i<numCourses; i++){
            if(in[i] == 0) q.push(i);
        }
        while(!q.empty()){
            int cur = q.front(); q.pop();
            ret.push_back(cur);
            for(int next : graph[cur]){
                if(--in[next] == 0) q.push(next);
            }
        }
        return ret.size() == numCourses ? ret : vector<int>();
    }
};

DFS:

DFS有向图,需要建立visited vector, int, 取0,-1,1. 其中 -1表示有loop。无向图,将前一个节点,作为pre带去dfs函数中,如果相等则continue。

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<int> ret;
        vector<vector<int>> graph(numCourses, vector<int>());
        for(auto it : prerequisites){
            graph[it.second].push_back(it.first);
        }
        vector<int> visited(numCourses, 0);
        for(int i=0; i<numCourses; i++){
            if(!dfs(graph, visited, ret, i)) return vector<int>();
        }
        if(ret.size() != numCourses) return vector<int>();
        reverse(ret.begin(), ret.end());
        return ret;
    }
    
    bool dfs(vector<vector<int>> &graph, vector<int> &visited, vector<int> &ret, int cur){
        if(visited[cur] == -1) return false;
        else if(visited[cur] == 1) return true;
        visited[cur] = -1;
        for(auto it : graph[cur]){
            if(!dfs(graph, visited, ret, it)) return false;
        }
        visited[cur] = 1;
        ret.push_back(cur);
        return true;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • detect cycle的题。 1、用dfs做: 需要一个数据结构来储存当前走过的路径,每次走完这整条路成功的话,...
    __小赤佬__阅读 308评论 0 0
  • 这道题跟Graph 那题基本一样,唯一的不同在于,这道题是directed graph. 一个很tricky的地方...
    98Future阅读 248评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,778评论 0 33
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 2,362评论 0 3
  • 我已无法再向你靠近,扭扭捏捏拖泥带水 你说我为何冷漠 我怕害了你。 干脆冷漠。 因为我知道我已没有办法对你付诸真心...
    寻0阅读 604评论 0 0