Leetcode 207. Course Schedule | 含C++笔记

这题是graph的问题。

Input

这题是大学修课挡修的问题,我是没有遇过挡修啦,所以没什麽感觉,但程序一跑,就会直接宣布你能不能毕业还挺微妙的。

 
 
看了一下Example,看起来也是在图里判断有无环的产生就行,不过这次是有向图,有环表示无解,无环表示修得完。


 
 
恩~这样用矩阵可能会太大?

 
 
 

思路:

总之先用adj list,把课与课之间的关系用有向图的形式存起来,然後用DFS的概念好了,去遍历图上的点,主要就是如果点有被discover两次,就代表图上有环。
 
 
 

笔记:

对c++的vector真的很不熟,每次用完每次忘,记一下笔记好了0.0

vector可用於宣告动态阵列,我记得特别是因为宣告时占用的是连续记忆体,所以存取很快,用得时候宣告vector,然後用角括号<>包住此vector的型态。

宣告int的2维vector array的话,就用vector<>包住vector<int>就行。

跟直接宣告的2维阵列不同,vector array不能用一般c/c++的for调用。
需要用iterator或for( auto el: vectorname )
 
 
 

程序码:

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> adjlist(numCourses);
        for (auto pair: prerequisites){
            adjlist[pair[1]].push_back(pair[0]);
        }
        
        vector<bool> discover(numCourses, false), finish(numCourses, false);
        for (int i = 0; i < numCourses; i++) {
            if (!finish[i]) {
                if(cyclic(adjlist, discover, finish, i)){
                    return false;
                }
            }
                
        }
        
        return true;
    }
private:
    bool cyclic(vector<vector<int>>& adjlist, vector<bool>& discover, vector<bool>& finish, int curr_node) {
        if (discover[curr_node]) //有没有被探索过啊?
            return true;
        if (finish[curr_node]) //这点的neighbor都已经被探索完了?
            return false;
        discover[curr_node] = true;
        for (auto v : adjlist[curr_node]) //来搜寻neighbor
            if (cyclic(adjlist, discover, finish, v))
                return true;
        discover[curr_node] = false; finish[curr_node] = true;//把这点的状态切换成已探索完成
        return false;
    }
};

Bug参考

是说,有段时间我一直遇到Time limit的问题,後来发现是我使用副程序时,没有用&把变数位置传过去,难怪我的recursive永远跑不完:3
 
 
参考:
https://youtu.be/PMMc4VsIacU
https://leetcode.com/problems/course-schedule/discuss/58509/C%2B%2B-BFSDFS
https://web.ntnu.edu.tw/~algo/DirectedAcyclicGraph.html


<<:  Day 6 : 数学运算与逻辑判断

>>:  Day 06 | Dart基本介绍 - private & static

入门魔法 - 流程判断 if else if

前情提要 艾草:「好啦,还是有其他条件可以判断你能不能成为大魔导师的!」 「哪尼~这麽好康的事不会早...

Visual Studio程序码签章问题

最近实作ClickOnce出现的一些问题: 将密钥导入 Visual Studio 2019 时出错...

[第20天]理财达人Mx. Ada-Telegram Bot-echo测试

前言 本文说明使用Python建立Telegram Bot-echo测试 。 程序实作 from t...

DOM实作 密码输入

<!DOCTYPE html> <html lang="en"...

Day 28. 组件基础 - Components

沃呜!铁人倒数3天了,我们离完赛就差一颠点啦,我们今天来讲讲components吧~继续gogogo...