力扣--课程表--bfs+dfs

整体思路:

 这是一道拓扑序列的题目,我们将边的方向定义成从先修课指向后修课的方向,借一下官方的题解图片,我们需要判断的是形成的这个图结构是否存在环,如果存在环,那么代表不能完成所有课程的学习。

bfs思路:

首先将每个点的入度数记录到hmap中,将每个点的后续节点记录到record中(record是一个unordered_map<int,vector<int>>结构,指的是某个节点指向的后续节点),首先遍历hmap中所有入度为0的节点,说明这些课程不需要先修课,他们可以直接被修完。将这些节点去掉,并且将该节点的后续节点的hmap值-1。再次遍历hmap,去掉入度数为0的节点....用什么结构来实现这个过程呢?队列~

代码:

C++:
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {//广度优先搜索---记录入度unordered_map<int,int> hmap;unordered_map<int,vector<int>> record; //记录该门课程的后续课程int cnt=0;//初始化hmap,recordfor(int i=0;i<numCourses;i++){hmap[i]=0;}int len=prerequisites.size();for(int i=0;i<len;i++){int a=prerequisites[i][0];int b=prerequisites[i][1];hmap[a]+=1;record[b].push_back(a);}//将deque<int> q;//初始化qunordered_map<int,int>::iterator iter=hmap.begin();for(auto iter:hmap){if(iter.second==0){q.push_back(iter.first);hmap[iter.first]=-1;}}//while(!q.empty()){int p=q.front();  //该点入度为0,可删除q.pop_front();cnt++;int len=record[p].size();for(int i=0;i<len;i++){hmap[record[p][i]]--;}for(auto iter:hmap){if(iter.second==0){q.push_back(iter.first);hmap[iter.first]=-1;}}}if(cnt==numCourses){return true;}else{return false;}}
};

注意这句代码:

unordered_map<int,int>::iterator iter=hmap.begin();
Python:
class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:hmap=[0]*numCourseslen_pre=len(prerequisites)record=[[] for i in range(numCourses)]cnt=0for i in range(len_pre):a=prerequisites[i][0]b=prerequisites[i][1]hmap[a]+=1record[b].append(a)q=deque()for index,value in enumerate(hmap):if value==0:q.append(index)hmap[index]=-1while q:p=q[0]q.popleft()cnt+=1len_=len(record[p])for i in range(len_):hmap[record[p][i]]-=1for index,value in enumerate(hmap):if value==0:q.append(index)hmap[index]=-1if cnt==numCourses:return Trueelse:return False

Python中的deque需要 from collections import deque

注意这句代码:(替代vector<vector<int>>)

record=[[] for i in range(numCourses)] #正确
record=[[]]* numCourses  #错误

注意这句代码:(替代key为索引的字典/替代需要查找索引的list)

for index,value in enumerate(hmap):

dfs思路:

我们利用hmap来记录节点 i 的邻接节点,利用flag来记录节点的状态(flag=0代表该点未被dfs,flag=1代表该点正在被路上的节点dfs,flag=-1代表该点已被其他节点dfs)。

大致dfs的思路是这样的(以节点 i 开始),首先判断节点 i 是否被其他节点 dfs(即flag=1),如果成立,则说明暂时无环,返回false。其次判断节点 i 是否属于正在被路上节点dfs,如果成立,则代表有环,返回true。如果该点未被访问,将该点的邻接节点依次遍历,遍历中如果有环,返回true,如果无环,将 i 节点的flag值记为-1。

代码:

C++:
class Solution {
public:bool dfs(int i,unordered_map<int,vector<int>>& hmap,vector<int>& flag){//以第i个点为起点//有环返回true,无环返回falseif(flag[i]==1){return true;}if(flag[i]==-1){return false;}flag[i]=1;int len=hmap[i].size();for(int j=0;j<len;j++){if(dfs(hmap[i][j],hmap,flag)){return true;}}flag[i]=-1;return false;}bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {int len=prerequisites.size();unordered_map<int,vector<int>> hmap;for(int i=0;i<len;i++){hmap[prerequisites[i][1]].push_back(prerequisites[i][0]);}vector<int> flag(numCourses,0);for(int i=0;i<numCourses;i++){if(dfs(i,hmap,flag)){return false;}}return true;}
};

Python:

class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:def dfs(i,hmap:List[List[int]],flag:List[int]) -> bool:if flag[i]==1:return Trueif flag[i]==-1:return Falseflag[i]=1len_hmap=len(hmap[i])for j in range(len_hmap):if dfs(hmap[i][j],hmap,flag):return Trueflag[i]=-1return Falselen_pre=len(prerequisites)hmap=[[]for _ in range(numCourses)]for j in range(len_pre):hmap[prerequisites[j][1]].append(prerequisites[j][0])flag=[0]*numCoursesfor j in range(numCourses):if(dfs(j,hmap,flag)):return Falsereturn True

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强推游戏爱好者!雾锁王国联机服务器部署教程

继《幻兽帕鲁》游戏爆火之后&#xff0c;与它同类型的《雾锁王国》也是强力刷屏&#xff0c;不分伯仲&#xff0c;在 Steam 上的评分一直稳定在“特别好评”&#xff0c;让小伙伴们很“上头”。就在两者游戏玩家反响爆火的同时&#xff0c;官方服务器人数爆满&#xff0c;卡顿频…

JavaScript进阶2之执行上下文、作用域链、函数创建、函数激活、checkScope的执行过程、闭包、this

JavaScript进阶 执行上下文执行上下文中的属性变量对象全局上下文的变量对象函数上下文执行过程进入执行上下文代码执行思考题 作用域链函数创建函数激活checkScope的执行过程总结 闭包分析闭包 this 执行上下文 执行上下文中的属性 每一个执行上下文都有三个核心属性 变量对…

【趣味项目】一键生成LICENSE

【趣味项目】一键生成LICENSE 项目地址&#xff1a;GitHub(最新版本) | GitCode(旧版本) 项目介绍 一款用于自动生成开源项目协议的工具&#xff0c;可以通过 npm 进行安装后在命令行使用&#xff0c;非常方便 使用方式 npm install xxhls/get-license -gget-license --l…

python的函数与类的定义

目录 1.函数 1.函数的定义 2.输入参数与输出参数的类型 3.输入和输出多个参数 1.普通参数 2.含有任意数量的参数 3.关键字参数 4.普通参数与多个参数的结合 2.类 1.类的定义 2.类的实例化 3.继承 1.函数 1.函数的定义 def 函数名(输入参数): 文档字符串 函数体 …

第七届国际通信与网络工程会议(ICCNE 2024)即将召开!

2024年第七届国际通信与网络工程会议&#xff08;ICCNE 2024&#xff09;将于7月26-28日在越南岘港召开。本次会议由维新大学主办&#xff0c;岘港大学、胡志明市科技大学协办。ICCNE 2024旨在为来自行业和学术界的研究人员、从业者和专业人士提供论坛&#xff0c;分享其最新研…

基于boost库的搜索引擎项目

文章目录 一、项目背景二、什么样的搜索引擎三、搜索引擎的宏观图原理四、Parse模块4.1下载boost库源代码4.2提取boost库中以.html为结尾的文件4.2.1 boost库的简单使用 4.3数据清洗(去标签化)4.3.1数据清洗的具体实现 4.4将清洗后的数据写入到raw.txt文件中 五、正排索引 vs 倒…

C++面试问题收集

0 持续更新中 目录 0 持续更新中 1 C语言相关 1.1 malloc/free和new/delete区别 1.2 内存泄漏 1.3 堆区和栈区的区别 1.4 宏定义和const的区别 1.5 多态 1.6 类中的静态成员变量 2 操作系统相关 2.1 进程和&#xff08;用户&#xff09;线程的区别 2.2 系统调用 2.3…

学习SSM的记录(七)-- SSM整合

目录 SSM整合理解 什么是SSM整合 SSM整合核心问题 1.SSM整合需要几个ioc容器 2.每一个ioc容器对应哪些类型组件 ​编辑 3.ioc容器之间关系和调用方向 4.具体多少配置类以及对应容器关系 5.ioc初始化方式和配置位置 ​编辑 SSM整合配置实战 1.数据库准备 2.创建项目…

十分钟教你有效运用百度检索式

十分钟教你有效运用百度检索式 ​ 百度作为国内最大的搜索引擎网站&#xff0c;虽然很多人都喷它的搜索页面广告太多&#xff0c;但是对于不会科学上网的同学来说&#xff0c;似乎除了继续用百度以外也没有更好的选择。 ​ 其实搜索引擎一般都会内涵一些高级的搜索技巧&#…

中间件漏洞(redis)

目录 1.Redis服务器被挖矿案例 2.redis常见用途 3.redis环境配置 4.redis的持久化机制 5.redis动态修改配置 6.webshell提权案例 7.定时任务bash反弹连接提权案例 8.SSH Key提权案例 9.redis安全加固分析 1.Redis服务器被挖矿案例 我没有体验过&#xff0c;那就看看别…

【Redis】Redis常用命令一

1.keys&#xff1a;返回所有满足条件的key&#xff0c;比如&#xff1a; KEYS pattern时间复杂度&#xff1a;O(N)&#xff0c;返回值&#xff1a;匹配pattern的所有key。 • h?llo 匹配 hello , hallo 和 hxllo • h*llo 匹配 hllo 和 heeeello • h[ae]llo 匹配 hello 和 …

【CSP试题回顾】201709-1-打酱油

CSP-201709-1-打酱油 解题代码 #include<iostream> using namespace std;int n, num;int main() { cin >> n;if (n / 50 ! 0){num 7 * (n / 50);n % 50;}if (n / 30 ! 0){num 4 * (n / 30);n % 30;}if (n / 10 ! 0) num (n / 10);cout << num;return…

Flask 专题

[CISCN2019 总决赛 Day1 Web3]Flask Message Board 查看session解密 但不知道密钥&#xff0c;题目说FLASK,那肯定就是找密钥,发现输入什么都没有显示&#xff0c;只有author那里有回显在版上&#xff0c;所以尝试sstl&#xff0c;{{config}}找到密钥 扫目录发现有admin进入…

6个免费的3D模型网站,助你3D建模渲染不用愁

​随着3D建模和渲染技术的不断发展&#xff0c;其重要性也日益增加。创建新的3D模型往往需要耗费大量时间&#xff0c;因此&#xff0c;本文整理了六个顶尖的免费3D模型资源网站&#xff0c;以便您能够方便地获取3D模型&#xff0c;大幅减少建模时间。这些资源有助于您更快地开…

高铁地铁智慧公厕方案与案例介绍

随着轨道交通的快速发展&#xff0c;高铁、地铁、火车成为人们出行的主要交通工具。而在这种规划建设要求极具的场所&#xff0c;信息化、智慧化的管理系统部署必不可少&#xff0c;智慧公厕作为公共设施的重要组成部分&#xff0c;建设和管理也越来越受到重视。智慧公厕系统的…

elasticsearch(学习笔记)(分布式搜索引擎)(黑马)(kibana操作)

一、索引库操作 索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。 我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 1、mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型…

自动驾驶最强学习资料

自动驾驶最强学习资料 资料说明和获取方式 本资料包是作者吐血整理的干货&#xff01;目前为止应该是非常全的自动驾驶资料包&#xff01;是作者五年自动驾驶算法工程师的 积累&#xff01; 以上干货资料并不全是作者自己原创&#xff0c; 是作者作为五年自动驾驶算法工程的…

春招_程序员怎么写简历_写简历网站

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历更具吸引力。这其实是一个普遍现象:许多求职者仍停留在传统简历…

c++的类型转换和IO流

类型转换和IO流 一、c语言的类型转换 int i 1; // 隐式类型转换&#xff0c;这些类型都是表示数据的大小&#xff0c;整型家族包括char相互转化是因为他们只是范围不一样&#xff0c;浮点数与整型支持是因为浮点数本质也是表示数据的大小&#xff0c;只是加了精度而已&#…

vscode-server的搭建方法

一、配置服务器端口支持 1、开放端口&#xff1a; 2、关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service二、配置code-server到服务器上** 1、下载code-server-4.22.0-linux-amd64.tar.gz到本地&#xff08;可下载最新的版本&#xff09;&a…