力扣1462.课程表

2023-10-26

题目描述:

你总共需要上 numCourses 门课,课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite ,其中 prerequisites[i] = [ai, bi] 表示如果你想选 bi 课程,你 必须 先选 ai 课程。

  • 有的课会有直接的先修课程,比如如果想上课程 1 ,你必须先上课程 0 ,那么会以 [0,1] 数对的形式给出先修课程数对。

先决条件也可以是 间接 的。如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的先决条件。

你也得到一个数组 queries ,其中 queries[j] = [uj, vj]。对于第 j 个查询,您应该回答课程 uj 是否是课程 vj 的先决条件。

返回一个布尔数组 answer ,其中 answer[j] 是第 j 个查询的答案。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
输出:[false,true]
解释:课程 0 不是课程 1 的先修课程,但课程 1 是课程 0 的先修课程。

示例 2:

输入:numCourses = 2, prerequisites = [], queries = [[1,0],[0,1]]
输出:[false,false]
解释:没有先修课程对,所以每门课程之间是独立的。
示例 3:

输入:numCourses = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
输出:[true,true]

提示:

  • 2 <= numCourses <= 100
  • 0 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)
  • prerequisites[i].length == 2
  • 0 <= ai, bi <= n - 1
  • ai != bi
  • 每一对 [ai, bi] 都 不同
  • 先修课程图中没有环。
  • 1 <= queries.length <= 104
  • 0 <= ui, vi <= n - 1
  • ui != vi

前言:

没错,又是课程表,只不过题目考的内容变了多了一点。理清题目的意思以及给的示例就要猜到这是一个有向图,又看到题目说没有环,那就容易想到拓扑图了。而且,题目中这种类似先决条件有强硬的顺序要求,容易考拓扑排序。

什么是拓扑排序?

对于任何有向图而言,其拓扑排序为其所有节点的一个线性排序(对于同一个有向图而言可能存在多个这样的节点排序)。该排序满足这样的条件:对于图中的任意两个节点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。

举个例子:你的朋友来家里吃饭,你准备做饭,你要做饭,首先得买菜,买菜得去超市,去超市要出门搭车,因此这个顺序就是 出门搭车 -> 到超市 -> 买菜 -> 回家做饭

对于题目中的先决条件和间接条件也是一个道理,如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,要想修课程c,那么就要先修课程b,而要想修课程吧,那么就要去修课程a。所以,修这三门课的拓扑顺序就是a-->b-->c,a一定在b的前面,b一定在c的前面。

思路:

由于题目要求的是对于第 j 个查询,回答课程 uj 是否是课程 vj 的先决条件。

我们可以建立一个邻接矩阵,f[a][b]表示a-->b这条边,返回类型为bool。f[a][b]表示a是b的先决条件。

那么在哪里去更新这个f[][]呢?

对于拓扑排序这个算法我们知道,每次在遍历一条边后都会把这条边删除,当遍历到t-->j这一条边,说明t是j的先决条件,也就是f[t][j]=true。那么我们可以再去遍历一遍所有到 j 的点,看看由f[t][j]能不能推出来其他的先决条件.


               f[t][j]=true;
               for(int h=0;h<numCourses;h++){
                   if(f[h][t]==true)f[h][j]=true;
               }

如果f[h][t]==true,说明h是t的先决条件,又由于f[t][j]=true,又能推出来f[h][j]=true.也就是当h-->t存在,t-->j存在,那么h-->j也存在。

由此,对于每一个点来说,每一个可以到这个点的边都可以被确认,这样一来,当我们把所有的边都遍历完后,可以确定的关系也就出来了。

代码:

public:
     int h[110],ne[10000],e[10000],idx;
     int d[110];
     int q[110];
     bool f[110][110];
     int hh=0,tt=-1;
     void add(int a,int b){
         e[idx]=b,ne[idx]=h[a],h[a]=idx++;
     }


    void topu(int numCourses){
       while(hh<=tt){
           int t=q[hh++];

           for(int i=h[t];i!=-1;i=ne[i]){
               int j=e[i];

               f[t][j]=true;
               for(int h=0;h<numCourses;h++){
                   if(f[h][t]==true)f[h][j]=true;
               }
               d[j]--;
               if(d[j]==0){
                   q[++tt]=j;
               }
           }
       }
    }
    vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {

       memset(h,-1,sizeof h);
       for(int i=0;i<numCourses;i++)d[i]=0;
       for(int i=0;i<10000;i++){
           ne[i]=0;
           e[i]=0;
       }
        for(auto it:prerequisites){
            int x=it[0];
            int y=it[1];
            add(x,y);
            d[y]++;
        }
        
        for(int i=0;i<numCourses;i++){
            if(d[i]==0){
                q[++tt]=i;
            }
        }
        topu(numCourses);
        vector<bool> ans;
       for(auto it:queries){
           int x=it[0];
           int y=it[1];
           
          ans.push_back(f[x][y]);
       }
        return ans;
    }

如果有对拓扑排序算法不了解的同学可以去b站的董晓算法去看看,讲的非常详细。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣1462.课程表 的相关文章

随机推荐

  • 软件测试基础知识 —— 白盒测试

    白盒测试 白盒测试 White Box Testing 又称结构测试 透明盒测试 逻辑驱动测试或基于代码的测试 白盒测试只测试软件产品的内部结构和处理过程 而不测试软件产品的功能 用于纠正软件系统在描述 表示和规格上的错误 是进一步测试的前
  • Ant Design of Blazor 教程 从0-1搭建 3.环境搭建

    1 Ant Design 引入 安装nuget包 找到Client的Program cs项目 我这里使用的是 NET 6 NET 5及以下直接写在方法体里面就ok了 在client的index html中引入对应的css和js 在 Impo
  • 逻辑结构与存储结构关系

    概述 逻辑结构是数据元素之间的关系 存储结构是数据元素一起关系在计算机中的存储方式 逻辑结构 逻辑结构是数据元素之间抽象化的关系 与数据的存储无关 独立于计算机 它是从具体问题中抽象出来的数学模型 集合 数据元素键除同属一个集合外 无其他联
  • 三维模型进行孔洞填充 (附 c++ 代码)

    代码的主要作用是对一个三维模型进行孔洞填充 并通过可视化工具展示填充后的结果 代码主要流程如下 加载原始三维模型数据 使用孔洞填充算法对模型进行孔洞填充 将填充后的模型数据保存到文件中 使用可视化工具展示填充后的模型 具体的代码解释如下 使
  • [改善Java代码]适时选择getDeclaredxxx和getxxx

    Java的Class类提供了很多的getDeclaredxxx方法和getxxx方法 例如getDeclaredmethod和getMethod成对出现 getDeclaredConstructors和getConstructors也是成对
  • LSC(Lens Shading Correction)——镜头阴影矫正

    产生原因 由于镜头原因导致光线丢失 注意红线 此时颜色就分离了 校正方法 网格化或者半径化方法 用一张灰度图来储存增益 各个像素点 增益恢复到最终的情况 网格化的方法通过划分网格节约存储空间 代码 不考虑像素存储 function LSCC
  • python二手房交易预测及展示系统

    一 项目目的及意义 项目的目的是在采集自贝壳二手房交易平台的成都市二手房成交数据的基础上 对数据进行处理和挖掘 以网站为载体实现二手房交易分析 卖方价格预测和买方房屋推荐三个主要功能 二手房交易分析功能服务于统计人员 对成都的二手房交易做完
  • 树莓派配置WiFi热点,远程播放视频小项目手把手教学

    1 安装树莓派OS镜像 Raspberry Pi OS Raspberry Pihttps www raspberrypi com software 下载官方镜像32位 一定不能下载最新版 下载最新版会导致后面步骤无法正常进行 我是用的是2
  • 51单片机点亮LED灯以及实现2盏LED灯的交替闪烁

    点亮LED灯 根据单片机原理图 将LED灯1和LED灯2介入单片机的口设为低电平即可 代码如下 include reg52 h sbit led1 P3 7 void main led1 0 给led1一个低电平 点亮 结果图 图中有一盏L
  • c# 创建只接收消息的窗口

    如果用自带的form 必须show后再hide 不是很好用 用以下代码即可 public class NotifierNativeWindow NativeWindow const string WindowName MessageOnly
  • Java源码 JavaWeb开发框架 代码 SSH SSM OA ERP CRM Java项目[Java通用框架源码及开发视频教程]

    Java源码 JavaWeb开发框架 代码 SSH SSM OA ERP CRM Java项目 功能简介 A 代码生成器 开发利器 生成Java各层次的类和JSP等文件 提高开发效率 B 阿里巴巴数据库连接池Druid 性能好的数据库连接池
  • python基础学习(4)—文件处理

    python学习基础之文件处理 文件和目录管理 os os path os walk open打开文件 文件和目录管理 python能够快速大量地处理计算机系统中地文件与文件夹 可以用OS包进行目录地创建与删除 文件删除 执行操作系统等操作
  • vue 登录页面记住密码功能

    vue iview element 一般用来快速搭建后台管理系统 登录页的记住密码功能也是必不可少的 记住密码快速登录功能 iview ui 思路 首次登录 记住密码 将密码存储到cookie中 退出登录 下次进来的时候 读取cookie登
  • chatgpt赋能python:PythonSave函数:保存和保护你的数据

    Python Save函数 保存和保护你的数据 Python Save函数是Python编程中最常用的函数之一 它允许开发者将数据保存到文件或数据库中 在未来的操作中访问和使用 无论你是处理大数据集还是需要保护数据免受未经授权访问 Pyth
  • c++ 文件操作

    1 根据需要引用头文件 include
  • ARM的MMU内存管理工作原理

    文章目录 1 虚拟地址 物理地址 逻辑地址 线性地址 运行地址之间的联系 2 MMU是什么 以及有mmu有什么作用 3 MMU RAM与arm core之间的关系 4 MMU的TLB与配置 5 MMU的地址映射 5 1 1M的section
  • 微信扫描普通二维码进入小程序

    微信扫描普通二维码进入小程序的方法 和代码没有什么关系 主要是在小程序平台进行设置 1 开发配置 开发 开发管理 开发设置 扫普通链接二维码打开小程序 2 配置规则 根据说明配置内容就行 后面有说带参数的配置和怎么在小程序里面获取参数 带参
  • 应急响应流程以及入侵排查

    归纳转载于 应急响应的整体思路和基本流程 FreeBuf网络安全行业门户不管是普通的企业 还是专业的安全厂商 都不可避免的需要掌握和运用好信息安全的知识 技能 以便在需要的时候 能够御敌千里 https www freebuf com ar
  • javascript实现关键字搜索和匹配关键字高亮效果

    效果图
  • 力扣1462.课程表

    题目描述 你总共需要上 numCourses 门课 课程编号依次为 0 到 numCourses 1 你会得到一个数组 prerequisite 其中 prerequisites i ai bi 表示如果你想选 bi 课程 你 必须 先选