207. 课程表——图论、深度遍历

news/2024/7/20 20:27:53 标签: 图论, 深度优先, 算法, c++, leetcode
class Solution {
public:
    bool flag = true;
    vector<int> visited;
    vector<vector<int>> vecVecInt;
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        //其实是一个图论问题,看图中是否存在环
        //那么我们只要把每个课程看成点, 先修课程关系看成线,然后观察有没有环就可以了
        visited.resize(numCourses); //构造numCourses大小的visited数组,记录是否已经访问过该点
        vecVecInt.resize(numCourses);   //构造numCourses大小的vecVecInt数组,记录该点与其他点的连接关系
        for(auto i : prerequisites){    //遍历所有先修课程关系,构造图
            vecVecInt[i[0]].push_back(i[1]);
        }
        for(auto i = 0; i < numCourses && flag; ++i){   //对每个点遍历,观察从该点开始是否存在环
            dfs(i);
        }
        return flag;    //flag用作记录全局中是否存在环,默认为true,存在为false
    }
    void dfs(int n){    //深度遍历图
        if(visited[n] == 2) //2表明该点已经访问过了,并且不是环上的点
            return;
        visited[n] = 1; //标记为该点访问过了
        for(auto i : vecVecInt[n]){
            if(visited[i] == 0){    //visited == 0 说明还没有访问过
                dfs(i); //访问该点
                if(!flag)   //如果访问之后,flag变为false,说明访问时发现环关系了
                    return; //快速结束所有访问
            }
            else if(visited[i] == 1){   //visited == 1 说明之前已经访问过了,这是第二次访问,即存在环关系
                flag = false;   //发现环关系,flag置为false
                return;
            }
        }
        visited[n] = 2; //该点为安全点
    }
};

Accepted
51/51 cases passed (24 ms)
Your runtime beats 33.99 % of cpp submissions
Your memory usage beats 23.46 % of cpp submissions (14.1 MB)


http://www.niftyadmin.cn/n/754572.html

相关文章

深入解析虚拟化(二)——VMWare和使用二进制翻译的虚拟化

深入解析虚拟化&#xff08;二&#xff09;——VMWare和使用二进制翻译的虚拟化 译者注&#xff1a;由于本片文章涉及较多的操作系统以及编译原理相关知识&#xff0c;译者才疏学浅&#xff0c;难免有翻译的不准确或错误的地方&#xff0c;希望大家多多包涵&#xff0c;欢迎评论…

国外10个ASP.Net C#下的开源CMS

国外10个ASP.Net C#下的开源CMS https://blog.csdn.net/peng_hai_lin/article/details/8612895&#xff11;、Ludico Ludico是C#编写的居于ASP.NET 2.0的Portal/CMS系统。它的模块化设计是你可以按照你希望的使用或开发网站功能。它里面有高级的用户管理&#xff0c;一个所见即…

208. 实现 Trie (前缀树)——附详细注释

class Trie { private:vector<Trie*> vecTree; //前缀数的子节点&#xff0c;一般有26个bool isEnd; //如果该点是某个字符串的最后一个节点&#xff0c;则值为true&#xff0c;否则为falseTrie* searchPrefix(string prefix){ //由于search和startsWith存在共同性&…

20180530模拟赛T2——绀碧之棺

题目背景 qiancl 得到了一张藏宝图&#xff0c;上面写了一道谜题。 题目描述 定义\(F(n)\)为 n 在十进制下各个数位的平方和&#xff0c;求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n) n\)。 输入描述 一行三个正整数\(k,a,b\)。 输出描述 一行一个整数表示满足条件的\(n\)…

209. 长度最小的子数组——滑动窗口

方法一 暴力遍历 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size(), minLen 100001;if(n 0)return 0;for(int i 0; i < n; i){int sum 0;for(int j i; j < n; j){sum nums[j];if(sum > target){minL…

[翻译]深入解析虚拟化(三)——XEN和类虚拟化

关于类虚拟化的名词解释&#xff0c;在前面的翻译中&#xff0c;Paravirtualization被翻译为超虚拟化&#xff0c;该翻译参考自IBM对虚拟化分类的描述中。在国内的出版物中&#xff0c;由因特尔开源软件技术中心和复旦大学并行处理研究所共同编著的 《*系统虚拟化&#xff1a;原…

区块链相关介绍

https://yeasy.gitbooks.io/blockchain_guide/content/scenario/finance.html转载于:https://www.cnblogs.com/zinan/p/9114957.html

210. 课程表 II——深度遍历

class Solution { public://是课程表207题的升级版&#xff0c;不同是结果需要输出顺序数组//不同的地方作了标注&#xff0c;思路不懂的建议先翻看第207题的注释vector<vector<int>> vecVecInt;vector<int> visited;bool flag true;vector<int> ans;…