LeetCode 热题 100 | 图论(二)

目录

1  基础知识

1.1  什么是拓扑排序

1.2  如何进行拓扑排序

1.3  拓扑排序举例

2  207. 课程表

3  210. 课程表 II


菜鸟做题,语言是 C++

1  基础知识

1.1  什么是拓扑排序

含义:根据节点之间的依赖关系来生成一个有序的序列。

应用:

  • 在项目管理中,按照任务之间的的依赖关系来安排执行顺序。
  • 在编译原理中,按照编译单元的依赖关系来确定编译单元的生成顺序。
  • 在程序设计中,按照模块之间的依赖关系来确定模块的加载和执行顺序。

突然想起来好像在操作系统原理里学过!

1.2  如何进行拓扑排序

排序步骤:

  1. 选择入度为 0 的节点加入到排序结果中,并从图中移除该节点以及它的所有出边;
  2. 重复步骤 1,每次都选择入度为 0 的节点加入到排序结果中,并更新图中剩余节点的入度;
  3. 重复步骤 1 和 2,直到所有的节点都被加入到排序结果中,或者不再存在入度为 0 的节点。

名词解释:

  • → 节点  属于节点的 入边
  • 节点 →  属于节点的 出边

如果图中不再存在入度为 0 的节点,且并非所有的节点都被加入到排序结果中,那么说明原图中存在环。综上,拓扑排序的主要功能是帮助安排顺序,顺带帮助检测图中有没有环。

1.3  拓扑排序举例

下图描述了一个拓扑排序过程。

① 入度为 0 的节点有 B、D,我们任意选择 B,并删除它的出边:

② 入度为 0 的节点有 A、D,我们任意选择 A,并删除它的出边;更新后,入度为 0 的节点有 C、D,我们任意选择 C,并删除它的出边:

③ 入度为 0 的节点有 D,我们选择 D,并删除它的出边;更新后,入度为 0 的节点有 F,我们选择 F,并删除它的出边:

以此类推,不再赘述。通过 “任意选择” 一词可以看出,拓扑排序的结果不止一种。

2  207. 课程表

感觉解题方法和拓扑排序关系不大,更多的是从题意出发;想了很久要怎么才能把思路表述清楚,最终认为还是看代码来得快 TT

解题思路:假设有先修课程对 [0,1] 和 [0,2]

  • 初始化:获取每门课程的先修课程数组,比如:0 对应 [1,2]
  • 初始化:设置记录访问状态的数组,并将访问状态全部置为 0
  • 循环:访问每门课程,判断它的先修课程是否已经被全部修完
  • 如果它的先修课程未被全部修完,则表明无法完成所有课程的学习

访问状态:

  • visited[course] = 0:该门课程还未被学习
  • visited[course] = 1:该门课程正在被学习
  • visited[course] = 2:该门课程已经被学习

针对 “该门课程正在被学习” 的说法,需要说明的是,这是算法题而不是现实生活!如果一门课正在被学习,不是代表学习它需要一段时间,而是代表它的先修课程不可能被修完,导致我们永远学不了它。

class Solution {
public:
    vector<int> visited;
    vector<vector<int>> mustFinish;
    bool possible = true;

    void helper(int course) {
        // 指明该门课程正在被学习
        visited[course] = 1;
        // 判断其先修课程是否已被修完
        for (auto & preCourse : mustFinish[course]) {
            // 递归访问未被学习的先修课程
            if (visited[preCourse] == 0) {
                helper(preCourse);
                if (!possible) return;
                // 先修课程正在被学习(因为卡住了)
            } else if (visited[preCourse] == 1) {
                possible = false;
                return;
            }
        }
        // 指明该门课程已经被学习
        visited[course] = 2;
    }

    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        visited.resize(numCourses);
        mustFinish.resize(numCourses);

        // 获取每门课程的先修课程数组
        for (auto & p : prerequisites) {
            mustFinish[p[0]].push_back(p[1]);
        }
        // 循环访问每门课程
        for (int i = 0; i < numCourses && possible; ++i) {
            helper(i);
        }

        return possible;
    }
};

3  210. 课程表 II

在  207. 课程表  的基础上,增加一个数据结构来存储课程顺序即可。

唯一区别在于:

for (int i = 0; i < numCourses && possible && !visited[i]; ++i)

新增条件 !visited[i],不允许已经被访问过的课程再被访问,避免了课程重复被学习。

class Solution {
public:
    vector<int> visited;
    vector<vector<int>> mustFinish;
    bool possible = true;
    vector<int> ans;

    void helper(int course) {
        visited[course] = 1;
        for (auto & preCourse : mustFinish[course]) {
            if (visited[preCourse] == 0) {
                helper(preCourse);
                if (!possible) return;
            } else if (visited[preCourse] == 1) {
                possible = false;
                return;
            }
        }
        visited[course] = 2;
        ans.push_back(course);
    }

    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        visited.resize(numCourses);
        mustFinish.resize(numCourses);

        for (auto & p : prerequisites) {
            mustFinish[p[0]].push_back(p[1]);
        }

        for (int i = 0; i < numCourses && possible && !visited[i]; ++i) {
            helper(i);
        }

        if (possible) return ans;
        return {};
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构 -- 二叉树+树的深度优先遍历】

二叉树 1. 二叉树1.1 二叉树的介绍1.2 两种特殊的二叉树1.3 二叉树的性质1.4 二叉树的存储 2. 二叉树的基本操作2.1 二叉树的创建2.2 二叉树的优先遍历2.3 递归实现二叉树遍历2.4 用非递归实现二叉树遍历 1. 二叉树 1.1 二叉树的介绍 二叉树是一种数据结构&#xff0c;一颗二…

虚拟机数据恢复-虚拟机误还原快照后如何恢复还原前的数据?

虚拟机数据恢复环境&故障&#xff1a; 由一台物理服务器迁移到ESXI上的虚拟机&#xff0c;虚拟机迁移完成后做了一个快照&#xff0c;该ESXI上面一共运行了数十台虚拟机。某天工作人员不小心将快照进行了还原&#xff0c;虚拟机内的数据还原到了数年前刚迁移过来时的状态&a…

超详细的 pytest 钩子函数 之初始钩子和引导钩子来啦

前几篇文章介绍了 pytest 点的基本使用&#xff0c;学完前面几篇的内容基本上就可以满足工作中编写用例和进行自动化测试的需求。从这篇文章开始会陆续给大家介绍 pytest 中的钩子函数&#xff0c;插件开发等等。 仔细去看过 pytest 文档的小伙伴&#xff0c;应该都有发现 pyt…

利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例

利用小蜜蜂AI智能问答ChatGPTAI高清绘图生成图文故事案例 这段时间利用小蜜蜂AI网站做了一些编程、绘图以及数据分析方面的案例。再过几个月&#xff0c;我的大孙子就要出生了。我要用小蜜蜂AI智能问答和AI高清绘图为大孙子生成一个1-9的数字图文故事。 小蜜蜂AI网站可以扫如…

DangZero:通过直接页表访问的高效UAF检测(DangZero实现IMPLEMENTATION翻译)

We implement DangZero as a shared library that overlays the de- fault memory allocator via LD_PRELOAD. Additionally, DangZero requires a backend to be available for direct page table access, which we describe in detail in the following section. 我们将DangZ…

CTFHUB 命令执行

命令执行 原理&#xff1a; 在编写程序的时候&#xff0c;当碰到要执行系统命令来获取一些信息时&#xff0c;就要调用外部命令的函数&#xff0c;比如php中的exec()、system()等&#xff0c;如果这些函数的参数是由用户所提供的&#xff0c;那么恶意用户就可能通过构造命令拼…

Android编程环境搭建

一、下载软件&#xff1a; JDK、Android SDK、Android Studio 1.1 首先下载安装JDK 登录Java Downloads | Oracle网站下载javaJDK11&#xff0c;具体步骤如图1所示 图1 下载安装JDK 1.2 下载安装 Android Studio 到 Android Studio 的官网上下载对应安装包&#xff0c;链接…

20240301-2-ZooKeeper面试题(二)

11. Chroot 特性 3.2.0 版本后&#xff0c;添加了 Chroot 特性&#xff0c;该特性允许每个客户端为自己设置一个命名空间。如果一个客户端设置了 Chroot&#xff0c;那么该客户端对服务器的任何操作&#xff0c;都将会被限制在其自己的命名空间下。 通过设置 Chroot&#xff…

腾讯云-云+校园扶持-2核2G学生服务器套餐30元起

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

【树莓派系统配置+python3.8+环境配置踩坑点汇总】raspberrypi

最近又开始搞树莓派的深度学习模型。很多windows端的环境需要在树莓派上重新部署&#xff0c;中间出现了非常多的问题。主要以各种库的下载安装为主要。 首先&#xff0c;第一个问题&#xff1a; 树莓派系统烧录之后&#xff0c;默认apt一般需要升级看&#xff0c;而默认下载…

YOLOv9:Learning What You Want to Learn Using Programmable Gradient Information

YOLOv9&#xff1a;Learning What You Want to Learn Using Programmable Gradient Information 摘要 今天的深度学习方法关注的是如何设计最合适的目标函数&#xff0c;使模型的预测结果最接近ground truth的真实情况。同时&#xff0c;必须设计一个适当的体系结构&#xff…

【Vue3】函数式编程(h 函数)

h 函数的原理就是 createVNode。可以使用 h 函数封装一些小组件。 <template><table border><tr><th>name</th><th>age</th><th>操作</th></tr><tr v-for"item in list" :key"item.age"&…

基于 LLaMA 和 LangChain 实践本地 AI 知识库

有时候,我难免不由地感慨,真实的人类世界,本就是一个巨大的娱乐圈,即使是在英雄辈出的 IT 行业。数日前,Google 正式对外发布了 Gemini 1.5 Pro,一个建立在 Transformer 和 MoE 架构上的多模态模型。可惜,这个被 Google 寄予厚望的产品并未激起多少水花,因为就在同一天…

免费的ChatGPT网站( 7个 )

ChatGPT 是由 OpenAI 公司研发的一款大型语言模型&#xff0c;它可以实现智能聊天、文本生成、语言翻译等多种功能。以下是 ChatGPT 的详细介绍&#xff1a; 智能聊天&#xff1a;ChatGPT 可以与用户进行自然语言对话&#xff0c;回答用户的问题&#xff0c;提供相关的信息和建…

(Linux学习三)用户管理相关文件详解,用户以及用户组的基本操作命令

一. 用户管理相关文件介绍 /etc/passwd 文件里面存 储了用户信息&#xff0c;一共7列数据 冒号分割列 /etc/shadow 用户密码加密信息&#xff0c;9列数据 /etc/group 用户组信息&#xff0c;4列数据 1. /etc/passwd文件7列数据详解&#xff1a; root:x:0:0:root:/root:/bin/…

[伴学笔记]01-操作系统概述 [南京大学2024操作系统]

文章目录 前言jyy:01-操作系统概述 [南京大学2024操作系统]为什么要学操作系统?学习操作系统能得到什么? 什么是操作系统?想要明白什么是操作系统:时间线:1940s1950s-1960s1960-1970s年代. 信息来源: 前言 督促自己,同时分享所得,阅读完本篇大约需要10分钟,希望为朋友的技术…

Tomcat -2

1. 动静分离 ① 单机反向代理 7-2 代理服务器 7-5 tomcat 设置 7-3 测试&#xff1a; 代理服务器那里写什么就显示什么

git代码上库流程(一篇就够了)

文章目录 一、前言二、创建新分支三、修改代码四、合并分支 一、前言 多人协同开发一个项目&#xff0c;为了方便管理代码&#xff0c;每个人代码提交不冲突。git代码仓库管理是不可或缺的。对于新手来说&#xff0c;既不懂git原理又不懂底层逻辑&#xff0c;还经常错误提交代码…

腾讯云学生服务器使用教程_申请腾讯云学生机详细流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

哪个超声波清洗机品牌值得入手?销量榜品牌值得选购!

在科技日益发展的今天&#xff0c;超声波清洗技术以其高效、便捷和深度清洁的特点&#xff0c;已经深入到生活的诸多领域&#xff0c;从精密仪器到珠宝首饰&#xff0c;从眼镜框到假牙&#xff0c;甚至是厨房用品的日常护理&#xff0c;都能见到超声波清洗机的身影。面对市场上…