清晰讲明 BFS实现的拓扑排序

前提:

图:就是结点和边组成的数据结构

有向无环图:就是每一个边都有方向,且无法构成一个环,只有没有环的图才能进行拓扑排序,所以拓扑排序也能用来证明该图有没有环

在有向无环图中有两个概念:

入度:有多少条边指向该节点

出度:有多少条边从该节点出发

AOV网:对于DAG图的实际性应用,对其结点和边加了一些信息

例如:

BFS实现的拓扑排序的意义:

在AOV网中可以看出这些事情有的需要很多前提,而有的不需要前提就能直接做。

那么拓扑排序的意义就是,在AOV网中找到做事情的先后顺序

根据AOV网整理后得到的做事情的顺序为如图:

这个序列也就叫做拓扑序列

进行拓扑排序的步骤(结合题目):

1.建图也就是建立AOV网或者说DAG图(如何建图在下文)

1.找到一个入度为0的点也就是不需要前提便可以直接做的事情,将其摘下来加入数组/或其他数据结构

2.然后删除该点其相连的边,也就是将其出度删除,那么其他点的入度便减少了

3.重复再找入度为零的点,直到图中没有点为止或者没有入度为0的点为止(图中有环)也就是可以判断图中是否有环

在bfs实现的拓扑排序中我们建图一般是通过邻接表来建立,结合该题目来看

假设共有五个课程0,1,2,3,4,组成的DAG图为如图

如上图为我们画出的邻接表,看第一个邻接表,0为头节点,箭头指向的是头节点的边指向的其他所有结点,因为形似链表且只隔边相接,所以叫做邻接表

所以邻接表就是DAG图中一个结点与其所有的出度指向的结点组成的一个结构

我们可以灵活使用c++提供的容器,我们可以使用二维数组,或者unordered_map来构建邻接表

vector<vector<int>>,可以用行的下标表示课程编号,用该行存储的数值表示指向的所有元素,但显然只能表示int类型的邻接表

unordered_map<Class=T,vector<T>>//前一个T,表示头节点的值,vector存储的是该头节点指向的所有元素,可以表示任何类型的邻接表

第二种方式更万能,更合适

2.再根据算法流程,灵活建图

再额外建立一个数组,用下标表示该结点的数字,存放的是该数字的入度。用来储存所有课程的入度

代码及其意义:

开始写代码:先把全部代码摆出来,接下来有具体模块代码的分析

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {//readyunordered_map<int,vector<int>>AL;vector<int> intake(numCourses);//creat drawfor(auto i:prerequisites){int a=i[0],b=i[1];AL[b].push_back(a);intake[a]++;}//topo sortqueue<int>q;for(int i=0;i<intake.size();i++)//push in queue if node's num==0{if(intake[i]==0)q.push(i);}//bfswhile(q.size()){int top=q.front();q.pop();for(auto i :AL[top]){intake[i]--;if(intake[i]==0)q.push(i);}}//find thr retfor(auto i:intake)if(i!=0)return false;return true;}
};

如何联想到拓扑排序呢?该题中题目有提示性语句为在学习课程a前必须学习课程b,明显存在前提的条件,与AOV网各个结点需要入度为0才能进行相同,则可以联想到拓扑排序。

:构造一个邻接表。map<int,vector<int>>AL,前一个int表示课程的编号,后一个vector表示该课程出度指向的全部课程。然后又建立一个vectorintake,下标表示课程的编号,该位置的值表示该课程的入度。

 //readyunordered_map<int,vector<int>>AL;vector<int> intake(numCourses);

:确立了拓扑排序之后,则我们首先要开始建图。也就是初始化AL表和intake里所有课程的入度,那么遍历prerequistes的元素记为i。题目中表示i[1]=a为学习i[0]=b的前提,则我们将AL中a的邻接表中加入b,并在intake[b]++,因为检测到b的入度有一个a。

//creat drawfor(auto i:prerequisites){int a=i[0],b=i[1];AL[b].push_back(a);intake[a]++;}

:开始利用bfs进行拓扑排序。首先创立队列,然后将入度为0的课程加入到队列里面。对队列初始化。

  //topo sortqueue<int>q;for(int i=0;i<intake.size();i++)//push in queue if node's num==0{if(intake[i]==0)q.push(i);}

开始bfs搜索,取出队列中元素,遍历该元素为头节点的邻接表中全部指向的课程。因为已经取出了该头节点课程,所以头节点指向的课程的入度应该统统减一,然后别忘了判断如果入度减为0的话可以将其加入到队列中。

  //bfswhile(q.size()){int top=q.front();q.pop();for(auto i :AL[top]){intake[i]--;if(intake[i]==0)q.push(i);}}

广度优先搜索之后,就要返回结果了。我们可以通过遍历各个课程入度是否等于0来确定课程是否能够全部可以学(也就是判断DAG图中是否有环)如果全为0返回true,如果存在不为0的话返回false。

  //find thr retfor(auto i:intake)if(i!=0)return false;return true;

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

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

相关文章

原生支付宝小程序 - 获取“dom“元素

在支付宝中是不能获取到dom元素的&#xff0c;但是我门可以借助my.createSelectorQuery来实现 Page({data:{sq:{}},onLoad(){},onShow(){this.setData({sq: my.createSelectorQuery()})} })通过axml来查看 <view>{{sq}} </view>会发现它只是一个Object&#xff0…

面试算法-177-二叉搜索树中第K小的元素

题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1 解 class Solution…

鸿蒙TypeScript学习第19天【命名空间】

1、TypeScript 命名空间 命名空间一个最明确的目的就是解决重名问题。 假设这样一种情况&#xff0c;当一个班上有两个名叫小明的学生时&#xff0c;为了明确区分它们&#xff0c;我们在使用名字之外&#xff0c;不得不使用一些额外的信息&#xff0c;比如他们的姓&#xff0…

低成本的云MES更合适中小企业

长期以来&#xff0c;面对激烈的竞争压力&#xff0c;我国传统的制造企业逐渐从大规模、低成本向多品种、小批量、定制化转型&#xff0c;逐步由粗放式管理向精益化管理靠拢&#xff0c;如ERP、CAD、PLM、OA等多个信息化系统已在我国制造企业中得到了较为广泛的应用&#xff0c…

python 无处不在的二分搜索

我们知道二分查找算法。二分查找是最容易正确的算法。我提出了一些我在二分搜索中收集的有趣问题。有一些关于二分搜索的请求。我请求您遵守准则&#xff1a;“我真诚地尝试解决问题并确保不存在极端情况”。阅读完每个问题后&#xff0c;最小化浏览器并尝试解决它。 …

【个人博客搭建】(8)全局异常处理

1、net 8 webapi 全局异常处理: 在 .NET 8 WebAPI 中&#xff0c;全局异常处理可以通过实现**IExceptionHandler接口或使用IAsyncExceptionFilter接口来完成**。 首先&#xff0c;关于IExceptionHandler接口&#xff0c;它是ASP.NET Core中用于全局异常处理的新抽象。这个接口有…

【C++】priority_queue(优先级队列介绍、仿函数控制大堆小堆、模拟实现)

一、优先级队列 1.1介绍 优先级队列&#xff08;Priority Queue&#xff09;是一种特殊的数据结构&#xff0c;其并不满足队列先进先出的原则&#xff0c;它结合了队列和堆的特点&#xff0c;允许我们在其中插入元素&#xff0c;并且能够保证任何时候提取出的元素都是当前队列…

不同性能压测工具对比

阿里云PTS 性能测试PTS&#xff08;Performance Testing Service&#xff09;是阿里云一款商业化的性能测试工具。支持按需发起压测任务&#xff0c;可支持百万并发、千万TPS流量发起能力&#xff0c;100%兼容JMeter。PTS支持的场景编排、API调试、流量定制、流量录制等功能&am…

【论文解读系列】从RNN/CNN到大模型全解析

论文&#xff1a;A Survey of Neural Code Intelligence: Paradigms, Advances and Beyond 地址&#xff1a;GitHub&#xff1a;https://github.com/QiushiSun/NCISurvey 文章目录 一、代码模型的发展 1.神经语言建模&#xff08;Neural Language Modeling&#xff09;时代 …

初识 React:安装和初步使用指南

文章目录 前言一、React 是什么&#xff1f;1.组件化开发2.虚拟 DOM3.单向数据流4.生态系统丰富 二、安装1.准备工作2.下载react 三、探索 React 应用总结 前言 在当今的 Web 开发领域&#xff0c;React 已经成为了一个备受推崇的技术。它的组件化、灵活性和高效性使得它成为了…

bugku-web-都过滤了

别说&#xff0c;页面还挺帅&#xff0c;这里所有链接点都是假的 账号密码错误的弹窗 这里几乎没有其他线索&#xff0c;现在能想到的有两种&#xff0c;SQL注入和爆破 开始爆破 得到账号为admin 得到最终密码bugkuctf 进入系统内部 发现这里过滤空格 可以用{}来代替空格作用…

K8s: 关于Kubernetes中的Pod的创建,实现原理,Job调度pod以及pod网络

Pod 概述 Pod 是最小部署的单元&#xff0c;Pod里面是由一个或多个容器组成&#xff0c;也就是一组容器的集合一个pod中的容器是共享网络命名空间&#xff0c;每个Pod包含一个或多个紧密相关的用户业务容器Pod 是 k8s 系统中可以创建和管理的最小单元是资源对象模型中由用户创…

Python介绍(未完)

文章目录 Python 背景知识Python 是谁创造的&#xff1f;Python 可以用来干什么&#xff1f;Python 的优缺点 搭建 Python 环境安装 Python搭建 PyCharm 环境新工具到手&#xff0c;赶紧试试中文设置第一个Python程序 Python基础语法基础语法&#xff08;1&#xff09;常量和表…

python复制文件夹内容

参考博客 https://blog.csdn.net/itfans123/article/details/133710731 案例1 import os import shutildef copy_folder(source_folder, destination_folder):# 创建目标文件夹os.makedirs(destination_folder, exist_okTrue)# 遍历源文件夹中的所有文件和文件夹for item in …

[docker] 核心知识 - 概念和运行

[docker] 核心知识 - 概念和运行 之前 docker 学了个开头就去搞项目去了&#xff0c;不过项目也开展了好久了&#xff0c;前端差不多吃透了&#xff0c;有些新功能需要用 docker 和 k8s……是时候重新学习一下了。 这一部分简单的过一下概念和讲一下怎么运行 docker 镜像和启…

论文复现《SplaTAM: Splat, Track Map 3D Gaussians for Dense RGB-D SLAM》

前言 SplaTAM算法是首个开源的基于RGB-D数据&#xff0c;生成高质量密集3D重建的SLAM技术。 通过结合3DGS技术和SLAM框架&#xff0c;在保持高效性的同时&#xff0c;提供精确的相机定位和场景重建。 代码仓库&#xff1a;spla-tam/SplaTAM: SplaTAM: Splat, Track & Map 3…

从零开始学习Linux(3)----权限

1.Linux权限的概念 Linux用户&#xff1a;1.root&#xff0c;超级管理员 2.非root&#xff0c;XXX&#xff0c;普通用户 命令&#xff1a;su[用户名] 功能&#xff1a;切换用户。 su -&#xff1a;是指以root的身份重新登录一次。 普通用户切换root需要输入密码&#xff0c;…

java算法day56 | 动态规划part15 ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 动规五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。确定递推公式 在确定递推公式的时候&#xff0c;…

优先编码器电路①

描述 下表是某优先编码器的真值表。 ①请用Verilog实现此优先编码器 输入描述 ①输入描述&#xff1a; input [8:0] I_n 输出描述 ①输出描述&#xff1a; output reg [3:0] Y_n 解题分析 本优先编码器&#xff0c;可采用case语句实现&#xff…

嵌入式操作系统FreeRTOS(队列管理)

1.队列管理 &#xff08;1&#xff09;数据存储 队列可以保存有限个具有确定长度的数据单元。队列可以保存的最大单元数目被称为队列的“深度”。在队列创建时需要设定其深度和每个单元的大小。通常情况下&#xff0c;队列被作为FIFO (先进先出)使用&#xff0c;即数据由队列尾…