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

[210. 课程表 II] 拓扑排序模板(DFS+BFS)

Problem: 210. 课程表 II

文章目录

  • 思路
  • 解题方法
  • Code

思路

本题是经典拓扑排序模板,通过DFSBFS两种方式进行实现。

解题方法

  1. DFS

    1. DFS方法的重点在于如何标记节点状态,初做题者如果只用未访问和已访问两种状态很容易陷入死结。
    2. 正确的做法是使用三种状态未访问,正在访问和已访问,原因是原因是如果想遇到环一定是遇到了本次DFS路径上的节点,他们属于特殊状态需要标记出。而遇到尚未访问的和别的路径访问过的节点都是没有问题的。
  2. BFS

    1. BFS方法的重点在于多源,这也是BFS本身的一个特性,可以在图的多点同时进行BFS,参考题目994. 腐烂的橘子就很好地利用了这一特点。所以需要同时在图的多个地方进行操作时可以考虑多源BFS
    2. 首先将节点入度统计出来,初始化时加入入度为0的节点,之后每次出队节点就把节点指向的节点的入度减少,再入队新产生的入度为0的节点,如此重复。
    3. 这一做法和手写拓扑排序十分类似。结果中如果没有包含所有节点即说明图中有环,无法拓扑排序。

Code

代码中同时有DFSBFS两种实现

class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>> e(numCourses);vector<int> degree(numCourses);for(auto& prerequisity : prerequisites) {e[prerequisity[1]].push_back(prerequisity[0]);degree[prerequisity[0]]++;}auto res = dfs(numCourses, e);// auto res = bfs(numCourses, e, degree);return res;}/* DFS */vector<int> dfs(int n, vector<vector<int>>& e) {vector<int> vis(n, 0);  // 0未访问, 1正在访问, 2已被收录stack<int> s;bool valid = true;for(int i = 0; i < n; i++) {if(vis[i] == 0) dfs_rec(n, e, vis, s, valid, i);}if(valid == false) return {};vector<int> res;while(!s.empty()) {res.push_back(s.top());s.pop();}return res;}void dfs_rec(int n, vector<vector<int>>& e, vector<int>& vis, stack<int>& s, bool& valid, int cur) {if(vis[cur] == 1) {valid = false;return;}if(vis[cur] == 2) {return;}vis[cur] = 1;for(auto eg : e[cur]) {dfs_rec(n, e, vis, s, valid, eg);}s.push(cur);vis[cur] = 2;return;}/* BFS */vector<int> bfs(int n, vector<vector<int>>& e, vector<int>& degree) {queue<int> q;for(int i = 0; i < n; i++) {if(degree[i] == 0) q.push(i);}vector<int> res;while(!q.empty()) {auto cur = q.front();q.pop();res.push_back(cur);for(auto& eg : e[cur]) {degree[eg]--;if(degree[eg] == 0) q.push(eg);}}if(res.size() < n) return {};return res;}
};

相关文章:

[210. 课程表 II] 拓扑排序模板(DFS+BFS)

Problem: 210. 课程表 II 文章目录 思路解题方法Code 思路 本题是经典拓扑排序模板&#xff0c;通过DFS和BFS两种方式进行实现。 解题方法 DFS DFS方法的重点在于如何标记节点状态&#xff0c;初做题者如果只用未访问和已访问两种状态很容易陷入死结。正确的做法是使用三种状…...

我的第一个python web 网站

# -*- coding: utf-8 -*-import http.server import socketserver from datetime import datetimePORT 8000import sys# ...class MyHandler(http.server.SimpleHTTPRequestHandler):def do_GET(self):if self.path /:# 如果路径是根路径&#xff0c;返回页面内容self.send_r…...

产品展示型wordpress外贸网站模板

孕婴产品wordpress外贸网站模板 吸奶器、待产包、孕妇枕头、护理垫、纸尿裤、孕妇装、孕婴产品wordpress外贸网站模板。 https://www.jianzhanpress.com/?p4112 床品毛巾wordpress独立站模板 床单、被套、毛巾、抱枕、靠垫、围巾、布艺、枕头、乳胶枕、四件套、浴巾wordpre…...

四信全球化拓展再启新篇!LoRa传感器与云平台领航智能感知时代

随着科技浪潮的不断推进&#xff0c;物联网已逐渐融入我们的生活。刚刚结束的MWC24盛会上&#xff0c;四信带来了一系列前沿技术成果&#xff0c;不仅将5G技术成功扩展至当前市场主流类型的终端&#xff0c;更携手联通、ASR等业界巨头&#xff0c;在连接、5G RedCap、AI、LoRa以…...

阿里云k8s环境下,因slb限额导致的发布事故

一、背景 阿里云k8s容器&#xff0c;在发布java应用程序的时候&#xff0c;客户端访问出现500错误。 后端服务是健康且可用的&#xff0c;网关层大量500错误请求&#xff0c;slb没有流入和流出流量。 经过回滚&#xff0c;仍未能解决错误。可谓是一次血的教训&#xff0c;特…...

【STM32+OPENMV】矩形识别

一、准备工作 有关OPENMV最大色块追踪及与STM32通信内容&#xff0c;详情见【STM32HAL】与OpenMV通信 二、所用工具 1、芯片&#xff1a;STM32F103C8T6 2、CUBEMX配置软件 3、KEIL5 4、OPENMV 三、实现功能 寻找黑色矩形&#xff0c;并将最大矩形的四个边缘坐标发送给STM…...

在吗?腾讯云服务器优惠价格表曝光_2023年3月报价请过目!

腾讯云服务器多少钱一年&#xff1f;61元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器165元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…...

Revit-二开之创建Plane-(7)

2016版本的Plane 2017版本的Plane 2018版本及以上版本的Plane 由此可见2017版本是一个分水岭 #if REVIT2016Plane plane = new Plane(uiDoc.Document.ActiveView...

【操作系统学习笔记】文件管理1.2

【操作系统学习笔记】文件管理1.2 参考书籍: 王道考研 视频地址: Bilibili 文件的逻辑结构 无结构文件 文件内部的数据就是一系列的二进制流或字符流组成&#xff0c;又称流式文件&#xff0c;例如 .text 文件 有结构文件 由一组相似的记录组成&#xff0c;又称记录式文件…...

算法归纳【数组篇】

目录 二分查找1. 前提条件&#xff1a;2. 二分查找边界 2.移除元素有序数组的平方长度最小的子数组59.螺旋矩阵II54. 螺旋矩阵 二分查找 参考链接 https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#%E6%80%9D%E8%B7%AF 1. 前提条件&#xff1a; 数…...

【随笔】程序员如何选择职业赛道,目前各个赛道的现状如何,那个赛道前景巨大

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】系列文章&#xff0c;这一次的话题是《程序员如何选择职业赛道》 目录 背景热度柱状图赛道热度C/C云原生人工智能前沿技术软件工程后端JavaJavascriptPHPPython区块链大数据移动开发嵌入…...

进程之舞:操作系统中的启动、状态转换与唤醒艺术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…...

Java面试(4)之 Spring Bean生命周期过程

一, 整个加载的完整链路图 更详细的生命周期函数链路图(仅供参考) 二, Bean实例化的四种方式: 1, 无参构造器(默认且常用)6 2, 静态工厂方法方式(factory-method指定实例化的静态方法) 3, 实例工厂方法方式(factory-bean指定bean的name,factory-method指定实例化方法) 4, 实…...

JavaSE——面向对象高级一(1/4)-static修饰成员变量、应用场景,static修饰成员方法、应用场景

目录 static修饰成员变量 类变量的应用场景 static修饰成员方法 static修饰成员方法的应用场景 static 叫静态&#xff0c;可可以修饰成员变量、成员方法。 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a; 类变量实例变量&#xff08;对象的变量&#xff…...

轻量脚本语言Lua的配置与c++调用

文章目录 lua配置下载运行lua命令lua脚本的执行C++调用lua环境配置错误和警告测试c++程序lua脚本结果Lua是一种功能强大且快速的编程语言,易于学习和使用,并且可以嵌入到应用程序中。 Lua被设计成一种轻量级的可嵌入脚本语言。它被用于各种各样的应用程序,从游戏到web应用程…...

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判断两个链…...

设计模式-建造者模式实践案例

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。当一个对象需要多个部分或许多步骤来创建&#xff0c;并且需要将创建过程与表示分离时&#xff0c;建造者模式非常有用。建造者模式旨在找到一个解决方案&…...

freeRTOS_20240308

1.使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3); while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_ADC_Start(&hadc);adc_val HAL_ADC_GetValue(&hadc);printf("adc_va…...

利用chatgpt写论文使用教程

ChatGPT是人工智能技术的一种&#xff0c;可帮助人们综合运用和分析各种语言技巧&#xff0c;从而优化实验结果、加速研究流程以及提高文章质量。以下是利用ChatGPT写论文的使用教程&#xff1a; 综上所述&#xff0c;利用ChatGPT写论文涉及到一些技巧和方法&#xff0c;需要合…...

SMiC矩阵将于3月6日正式上线,开启数字化经济新纪元

在数字化浪潮的推动下&#xff0c;全球瞩目的SMiC矩阵将于2024年3月6日正式上线。这一里程碑式的事件标志着数字化经济迈入了一个全新的时代&#xff0c;为思洣客、合作伙伴和整个经济生态带来了前所未有的机遇和挑战。 SMiC矩阵作为引领数字化经济的新力量&#xff0c;始终致…...

备战蓝桥杯---动态规划的一些思想2

话不多说&#xff0c;直接看题&#xff1a; 1.换根DP&#xff1a; 我们肯定不能对每一个根节点暴力求&#xff0c;我们不妨先求f[1]&#xff0c;我们发现当他的儿子作为根节点时深度和为f[1](n-cnt[i])-cnt[i](cnt[i]表示以i为根的节点数&#xff09;&#xff0c;这样子两遍DFS…...

卫星导航 | 坐标系---地理坐标系与UTM坐标系

卫星导航 | 坐标系---地理坐标系与UTM坐标系 世界坐标系地理坐标系UTM坐标系 全球卫星导航系统(Global Navigation Satelite System,GNSS)&#xff0c;简称卫星导航&#xff0c;是室外机器人定位的一个主要信息来源。 卫星导航能给机器人提供什么信息&#xff1f; 正常工作时&…...

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码&#xff0c;往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时&#xff0c;就会把内存中的数据先读出来&#xff0c;加载到cpu寄存器中&#xff0c;再去参与运算。 但是&#xff0c;关键是cpu读…...

代码学习记录10

随想录日记part10 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.03 主要内容&#xff1a;今天的主要内容是深入了解数据结构中栈和队列&#xff0c;并通过三个 l e e t c o d e leetcode leetcode 题目深化认识。 20. 有效的括号1047. 删除字符串中的所有…...

java——2024-03-03

String类的对象能被修改吗&#xff1f;如果不能需要用什么修改&#xff1f;StringBuilder和StringBuffer的区别&#xff1f;equals和区别谈谈对面向对象的理解重载和重写的区别说一下ArrayList&#xff0c;LinkedList底层实现以及区别什么是哈希冲突&#xff1f;hashMap和conCu…...

Ubuntu安装conda以后,给jupyter安装C++内核

前言 大家都知道&#xff0c;jupyter notebook 可以支持python环境&#xff0c;可以在不断点调试的情况下&#xff0c;打印出当前结果&#xff0c;如果代码错了也不影响前面的内容。于是我就想有没有C环境的&#xff0c;结果还真有。 参考文章&#xff1a; 【分享】Ubuntu安装…...

【谈判】核心思想(抓大放小)

谈判交换&#xff08;抓大放小&#xff09; 一、明确目的 事&#xff1a;must: 非要不可&#xff0c;才会签字 want: 有很好&#xff0c; give: 放掉 三者&#xff0c;会变化 二、明确对象 人&#xff1a;我跟谁谈&#xff1f; 时&#xff1a; 国际形势、国家的政策、他的心…...

洛谷P5908 猫猫和企鹅 做题反思(2024.3.7)

猫猫和企鹅 题目传送门 题目描述 王国里有 n n n 个居住区&#xff0c;它们之间有 n − 1 n-1 n−1 条道路相连&#xff0c;并且保证从每个居住区出发都可以到达任何一个居住区&#xff0c;并且每条道路的长度都为 1 1 1。 除 1 1 1 号居住区外&#xff0c;每个居住区住…...

常见的验证码

一、短信验证码 前端&#xff1a; 用户填写手机号&#xff0c;点击按钮发送请求用户短信得到验证码后&#xff0c;用户填写表单提交 form 表单&#xff0c;进行验证 后台&#xff1a; 随机生成几位验证码并将生成时间、手机号、验证码存储起来&#xff0c;可以存到session、…...

11. C语言标准函数库

C语言制定了一组使用方式通用的函数&#xff0c;称为C语言标准函数库&#xff0c;用于实现编程常用功能&#xff0c;标准函数库由编译器系统提供&#xff0c;并按功能分类存储在不同源代码文件中&#xff0c;调用标准库内函数时需要首先使用 #include 连接对应的源代码文件。 【…...