【拓扑排序】课程表问题

news2024/9/27 23:23:07

一、拓扑排序问题描述

给定:一系列任务 (A,B,C …) + 任务间的依赖关系 (B 和 C 必须在 A 之前完成, …)

输出:这些任务间的合法执行顺序 (C – B – A – …)

总之, 有相互顺序的地方就有拓扑排序

二、数学模型

有向无环图 —— DAG

点 :任务
边 :任务间的对应关系

  • 图中的边都是有向边,即图为有向图。

  • 图中不存在环 (即不存在循环依赖)

三、拓扑排序算法 —— Kahn 算法

Kahn 算法 —— 基于广度优先搜索 BFS

  1. 统计所有点的入度
  2. 统计入度为 0 的点代表的任务
  3. 每执行完一个任务,所有后继任务的入度减1
  4. 重复 2 至 3 直到所有可执行任务都被执行完
  5. 若还有剩余任务,返回无解,否则返回任务执行顺序

使用 indegree 数组表示点的入度,队列 queue 中存储入度为 0 的点(可执行任务)。

从queue 中选取任务来执行,执行后更新 indegree 数组

四、例题 —— 课程表

题目描述

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。

例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

示例:

在这里插入图片描述

代码:

    // 课程表
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] inDegree = new int[numCourses];
        // 计算入度,存储
        for(int i=0; i<prerequisites.length; i++){
            inDegree[prerequisites[i][0]]++;
        }
        // 可执行任务
        Deque<Integer> deque = new LinkedList<>();
        for (int i=0; i<inDegree.length; i++){
            if(inDegree[i] == 0){
                deque.offer(i);
            }
        }
        // 遍历可执行任务
        while (!deque.isEmpty()){
            int task = deque.poll();
            for(int i=0; i<prerequisites.length; i++){
                if(prerequisites[i][1] == task){
                    inDegree[prerequisites[i][0]]--;
                    if(inDegree[prerequisites[i][0]] == 0){
                        deque.offer(prerequisites[i][0]);
                    }
                }
            }
        }
        // 判断是否都执行完
        for (int i=0; i<inDegree.length; i++){
            if(inDegree[i] > 0){
                return false;
            }
        }
        return true;
    }

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

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

相关文章

「图文讲解」浏览器原理与页面渲染过程

相信大家在面试的时候面试官总是会问一个问题&#xff1a;“可以说下浏览器从输入url到渲染页面完成过程吗&#xff1f;”&#xff0c;非官方标准答案来啦&#xff5e; 那我们首先需要先来讲一下浏览器是什么&#xff0c;浏览器其实就是一个应用软件&#xff0c;在学习操作系统…

《数据结构、算法与应用C++语言描述》线性表-数组描述

《数据结构、算法与应用C语言描述》线性表-数组描述 5表示在 数据结构算法与应用C语言描述 书中所在章节。 本文包含了《数据结构、算法与应用C语言描述》第五章主要练习题答案&#xff0c;给出了线性表数组描述完整测试代码。 5.1 数据对象 5.1.1 定义 数据对象(data obj…

java开发的师生评教小程序学生对老师评价老师对班级评价打分题单选题意见框系统选课系统

简介 源码1.0&#xff08;源码2.0选课功能&#xff0c;请往下看&#xff09; 师生评教小程序&#xff0c;学生可以对老师进行评价&#xff0c;老师可以对班级行进评级。管理员可以创建不同的评教模板&#xff08;单选题0分或者10分&#xff0c;打分题0-10分&#xff0c;意见框…

三分钟彻底搞懂paint,repaint,update!

最近总结了一下java中的paint&#xff0c;repaint和updata三者之间的关系&#xff0c;首先咱们都知道用paint方法来绘图&#xff0c;用repaint重绘&#xff0c;用update来写双缓冲。但是他们之间是怎么来调用的呢&#xff0c;咱们来分析一下(想直接看结果&#xff0c;请跳过分析…

2022卡塔尔世界杯感想

一、概述 说说我个人吧&#xff01;在体育活动上面真是没什么兴趣&#xff0c;篮球&#xff0c;足球...等等竞技运动不敏感&#xff01; 今年稍微关注了点世界杯比赛&#xff01;什么原因呢&#xff1f;我有一个爱买彩票/赌球的一个同事&#xff01;随着世界杯的进行&#xf…

风力发电机组机械功率Pm与转子转速Wm关系(Matlab实现)

目录 1 数学模型 2 代码 3 结果 1 数学模型 风力机空气动力学模型 风力涡轮机的动态输出机械扭矩表示为: 其中是空气密度 &#xff0c; A是叶片扫掠面积 &#xff0c; R是风力涡轮机的转子半径 (m)&#xff0c; 是风速 (m/s)。是叶片的功率系数&#xff0c;它是叶片桨距…

linux内网渗透:docker逃逸

Docker逃逸 前言 Docker 逃逸在渗透测试中面向的场景大概是这样&#xff0c;渗透拿到shell后&#xff0c;发现主机是docker环境&#xff0c;要进一步渗透&#xff0c;就必须逃逸到“直接宿主机”。甚至还有物理机运行虚拟机&#xff0c;虚拟机运行Docker容器的情况。那就还要…

基于VUE.JS的招聘系统

开发工具(eclipse/idea/vscode等)&#xff1a;idea 数据库(sqlite/mysql/sqlserver等)&#xff1a;mysql 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;本文是基于Vue.js对招聘系统的设计与实现&#xff0c;对招聘系统管理员、个人用户、企业用户三个模块功能的完善…

kubernetes学习之路--污点容忍度横向主节点

参考&#xff1a;K8s污点容忍度横向主节点-安全客 - 安全资讯平台 一.kube-scheduler调度 kube-scheduler是Kubernetes 集群的默认调度器&#xff0c;并且是集群控制面(master)的一部分。对每一个新创建的Pod或者是未被调度的Pod&#xff0c;kube-scheduler会选择一个最优的N…

[附源码]Nodejs计算机毕业设计基于图书管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

43_SDIO基础知识

目录 SDIO协议简介 SDIO设备分类 SD卡物理结构 SD卡寄存器列表 SDIO总线拓扑 SDIO总线 SDIO总线协议 SDIO命令 命令格式 命令类型 响应 SD卡的操作模式 卡识别模式 数据传输模式 STM32 SDIO功能框图 命令通道 命令状态机 数据通道 数据状态机 数据FIFO SDI…

自定义java注解案例

今天与大家分享java注解的基本使用&#xff0c;如有哪里有问题&#xff0c;望大家指教。 目录 1. 什么是java注解 2. java注解的分类 2.1 JDK基本注解 2.2 JDK元注解 3. 自定义注解 3.1 自定义注解语法 4. 注解示例 4.1 定义注解 4.2 拦截器 4.3 使用注解 4.4 测试 …

Kali Linux渗透测试演示——DNS欺骗

目录 一、DNS欺骗 1.介绍 2.原理 二、环境和工具 1.kali Linux和靶机&#xff08;这里选择windows 7&#xff09; 2.ettercap 三、攻击过程 1.首先确认一下Kali和靶机的IP地址以及网关 2.进入ettercap的配置文件 3.打开ettercap&#xff0c;进行主机发现 总结 一、DNS…

MR案例:计算学生成绩

计算学生成绩一、提出任务二、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动…

adb常用命令(二)

adb:Android下面一个通用的调试工具管理设备或者手机模拟器的状态&#xff0c;进行手机操作:安装软件、卸载软件、系统升级、运行shell命令等adb命令&#xff1a;一、环境配置1&#xff0c;Java--JDK java -version2&#xff0c;SDK adb versionsdk版本管理&#xff08;SDK与…

Spark-RDD(转换算子、行动算子、序列化、依赖关系、持久化、分区器、文件读取和保存、累加器、广播变量)

文章目录RDDRDD特点核心属性执行原理RDD创建RDD并行度与分区内存数据的分区文件数据的并行度和分区RDD转换算子Value类型mapmapPartitionsmapPartitionsWithIndexflatMapglom(获取分区数组)groupByfilterdistinctcoalesce(缩小/扩大分区)repartition(扩大分区)sortBysample双 V…

人工智能 之 机器学习(Machine Learning)

目录 一&#xff1a;机器学习概述 二&#xff1a;机器学习算法 三&#xff1a;机器学习模型 四&#xff1a;机器学习过程 五&#xff1a;机器学习模型验证 六&#xff1a;sklearn模块 一&#xff1a;机器学习概述 程序化处理和机器学习处理&#xff1b; 主观思维和客观思…

python利用read()、readline()、readlines()读取文件

目录 1.语法和用法 2.实例 1.语法和用法 with open(file,moder,encodingNone) as f:#①读取所有文本data1 f.read()#②读取第一行数据data2 f.readline() #③读取所有文本数据 data3 f.readlines() 说明&#xff1a; with …… as ……&#xff1a;用于命名&#xff0c…

2022年总结:打开新世界,踏上新征程

一、前言 于我而言&#xff0c;2022年是我的幸运年&#xff0c;人生发生转折的关键点。同时&#xff0c;也可能是互联网行业、社会经济状况开始扭转的一年。因此&#xff0c;打算在CSDN开始记录下我的第一篇年总结。当然除了是意义特殊外&#xff0c;也还有现实实在的意义&…

【ROS服务通信】服务端和客户端

本文记录下ROS服务通信的实现&#xff0c;首先明确&#xff0c;ROS中的服务通信主要适用于偶然的&#xff0c;有实时要求的场景。服务通信基于客户-服务的架构&#xff0c;在主节点下&#xff0c;由服务端和客户端组成&#xff0c;服务端负责对请求做出响应&#xff0c;客户端发…