当前位置: 首页 > article >正文

10.1 10.3 图DFS 中等 207 Course Schedule 210 Course Schedule Ⅱ

207 Course Schedule

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    bool hasCycle(int course ,unordered_map<int,vector<int>>& graph,vector<int>& visitStatus){
        //正在访问的结点再次被访问,存在环
        if(visitStatus[course] == 1)return true;
        //该结点已经被访问了且没有环,访问完毕了
        if(visitStatus[course] == 2)return false;
        //标记正在被访问的结点
        visitStatus[course] = 1;

        for(int pre : graph[course]){
            if(hasCycle(pre , graph ,visitStatus)){
                return true;
            }
        }

        //所有结点访问完毕,且不存在环,标记为2
        visitStatus[course] = 2;
        return false;
    }
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        //这道题是关于图的问题,不能存在环
        //使用数组进行保存
        //创建图,由于后序需要DFS查找,使用哈希表更为方便
        unordered_map<int,vector<int>> graph;
        for(const auto& pair : prerequisites){
            graph[pair[0]].push_back(pair[1]);
        }
        //创建访问数组,初始状态为0
        vector<int> visitStatus(numCourses,0);

        //遍历每个结点,使用DFS判断是否有环
        for(int i = 0 ; i < numCourses ;i++){
            if(hasCycle(i,graph,visitStatus)){
                return false;
            }
        }
        return true;
    }
};

210 Course Schedule II

在这里插入图片描述

在这里插入图片描述

class Solution {
public:
    bool DFS(int course,unordered_map<int,vector<int>>& graph ,vector<int>& visitStatus,vector<int>& route){
       if(visitStatus[course] == 1){
        //有环
            return true; 
       }
       if(visitStatus[course] == 2){
        //无环不受影响,但也不会继续向下执行
            return false;  
       }
       visitStatus[course] = 1;
    
        //判断所有先修课程
        for(int pre : graph[course]){
            if(DFS(pre , graph ,visitStatus ,route)){
                //有环
                return true;
            }
        }

        visitStatus[course] = 2;
        //记录路径中
        route.push_back(course);
        return false;
    }
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        //和Ⅰ一致
        //但是结果需要给出完成课程的过程序号
        //相当于判断是否有环+找简单路径
        //简单路径 **先找点** 使用的还是DFS
        int m = prerequisites.size();
        
        //路径记录
        vector<int> route;

        if(!m){
            //没有先序序列,返回1...numCourses-1的vector<int>
            for(int i = 0 ; i < numCourses;i++){
                route.push_back(i);
            }
            return route;
        }

        //找简单路径的过程中,判断是否有环
        //记录表
        unordered_map<int,vector<int>> graph;
        for(const auto& pair: prerequisites){
            graph[pair[0]].push_back(pair[1]);
        }
        //做标记是否走过 0 走过了 1 又走到了 2 
        vector<int> visitStatus(numCourses,0);
        
        
        for(int i = 0 ; i < numCourses ; i++){
            if(DFS(i, graph ,visitStatus, route)){
                return {};
            }

        }
        return route;
    }
};

http://www.kler.cn/news/332082.html

相关文章:

  • 【算法】链表:160.相交链表(easy)+双指针
  • 在VirtualBox中安装OpenEuler操作系统保姆级教程
  • 爬虫——同步与异步加载
  • 【Docker从入门到进阶】05. 实战案例
  • Java高效编程(18):优先使用组合而非继承
  • 宁夏众智科技OA办公系统存在SQL注入漏洞
  • HBase 性能优化 详解
  • GO语言深度探索:并发编程与高性能网络服务器实践
  • 一种简单安全的消息队列的C语言解决方案
  • CDGA|利用人工智能与边缘计算显著提升数据治理效率与效果的实践案例
  • 慢病中医药膳养生食疗管理微信小程序、基于微信小程序的慢病中医药膳养生食疗管理系统设计与实现、中医药膳养生食疗管理微信小程序的开发与应用(源码+文档+定制)
  • C++发邮件:如何轻松实现邮件自动化发送?
  • 828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接
  • MySQL 支持行锁还是表锁?分别有哪些优缺点?破解数据库的锁之谜:MySQL行锁与表锁的博弈
  • index.html 调用 ajax
  • 【Bug】STM32F1的PB3和PB4无法正常输出
  • 【案例73】Uclient无法读取https地址添加应用
  • MySQL 实验 3:创建数据表
  • 滚雪球学MySQL[8.2讲]:MySQL事件调度详解:定时任务的创建与管理及使用场景
  • 【web安全】——信息收集