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 {};}
};

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

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

相关文章

12:Logstash|Web日志实时分析

Logstash|Web日志实时分析 logstashlogstash工作结构安装Logstash编写logstash配置文件步骤一:codec类插件插件帮助手册Logstash input插件步骤一:file模块插件filter grok插件Web日志实时分析部署beats与filebeat步骤一:filter grok模块插件logstash 一个数据采集、加工处…

Ubuntu22.04系统 安装cAdvisor提示找不到 CPU 的挂载点错误解决办法。

如果我们在安装cAdvisor时容器启动不起来 查看日志如下图所示 1、查看cgroup文件系统是v2 还是 v1 mount | grep cgroup 如图所示我的是v2 &#xff0c; cAdvisor 目前的最新版本&#xff08;v0.39.0&#xff09;仍然只支持 cgroup v1&#xff0c;不支持 cgroup v2。因此&#…

闫震海:腾讯音乐空间音频技术的发展和应用 | 演讲嘉宾公布

一、3D 音频 3D 音频分论坛将于3月27日同期举办&#xff01; 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&…

Python 批量提取pdf/word中的图片,并生成markdown文档

from sdk.utils.util_class import PathParser from sdk.temp.temp_supports import IsSolution, DM 这些全是自定义的工具包&#xff0c;自己去其他文章下找 # !/usr/bin/python3 # -*- coding:utf-8 -*- """ author: JHC000abcgmail.com file: demo.py time:…

做抖店月入百万还是会亏损?珠珠来告诉你,做抖店水到底有多深?

我是电商珠珠 抖店的热度一直只高不低&#xff0c;所以很多想要做的新手不知道抖店水的深浅&#xff0c;就一股脑的去做了。结果又是被扣保证金&#xff0c;又是被判定无货源违规的&#xff0c;最后灰头土脸的关了店。那些说做了十万十几万的&#xff0c;几百万的难道都是假的…

Windows主机巡检vbs脚本

’ Windows主机巡检脚本 ’ 获取主机名称 Set objNetwork CreateObject(“WScript.Network”) strComputer objNetwork.ComputerName ’ 获取磁盘信息 Set objWMIService GetObject(“winmgmts:\” & strComputer & “\root\cimv2”) Set colDisks objWMISer…

在三个el-form-item中的el-radio的值中取一个发送给后端怎么获取

问: 请问,这段代码怎么获取:无策略,策略1,策略2的值? 回答: 问: 三个里面只可以选中一个吗? 回答:

应对求职高峰:金三银四必备问答与大厂模板,成功职场攻略!

三四月是求职的黄金季节&#xff0c;很多设计师会选择在这个时候准备作品集。一个视觉精美、有条不紊的作品集&#xff0c;无疑是走向大厂的敲门砖。但是我问了一圈优秀社区的朋友&#xff0c;发现大家或多或少都遇到过问题。今天我整理了群里的高频问题&#xff0c;附上了解决…

[GXYCTF2019]BabyUpload1 -- 题目分析与详解

目录 一、题目分析 1、判断题目类型&#xff1a; 2、上传不同类型的文件进行测试&#xff1a; 二、题目详解 1、写出.htaccess文件&#xff1a; 2、.htaccess 文件配合 .jpg 上传&#xff1a; 3、利用 中国蚁剑/中国菜刀 获取flag&#xff1a; 一、题目分析 1、判断题目…

信奥一本通:1082:求小数的某一位

分数转换为小数就是分子除分母&#xff0c;但是他要求指定的n项小数&#xff0c;n大于1小于10000&#xff0c;如果是10000的话就太大了&#xff0c;用传统的方式无法找出指定的位数。 方式就是&#xff1a;例如求2分之1&#xff0c;我们先用除法把具体的值求出来&#xff0c;然…

图机器学习(1)--导论

0 CS224W概况 斯坦福大学CS224W课程&#xff1a;http://cs224w.stanford.edu/ 图机器学习的库&#xff1a; 为什么是图&#xff1f;图是描述和分析具有关系/交互的实体的通用语言。 1 图数据举例 复杂域具有丰富的关系结构&#xff0c;可以表示为关系图。 通过显式地建模关…

【论文阅读】Generative Pretraining from Pixels

Generative Pretraining From Pixels 引用&#xff1a; Chen M, Radford A, Child R, et al. Generative pretraining from pixels[C]//International conference on machine learning. PMLR, 2020: 1691-1703. 论文链接&#xff1a; http://proceedings.mlr.press/v119/chen…

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候&#xff0c;脑海里先想出来的是暴力方法&#xff0c;一次排序&#xff0c;将这个数组变为有序的&#xff0c;再通过三次for循环来寻找满足条件的数字&#xff0c;然后将符合条件的数组与之前符合条件的数组进行一一对比…

2024.3.6补题

1.关鸡 对于这一道题&#xff0c;我们先按照题意进行分析&#xff1a;首先鸡自己的初始位置&#xff0c;如果着火点在鸡一开始的左右下各有一个那么就可以达到题目效果&#xff0c;也就是说不需要添加着火点&#xff0c;同时最多需要添加的着火点其实也就是它初始位置身边所有的…

Optional 详解

Optional 详解 1、Optional 介绍2、创建 Optional 对象3、Optional 常用方法1. 判断值是否存在 — isPresent()2. 非空表达式 — ifPresent()3. 设置(获取)默认值 — orElse()、orElseGet()4. 获取值 — get()5. 过滤值 — filter()6. 转换值 — map() 作为一名 Java 程序员&am…

animation给同一个元素加多个动画

需求&#xff1a; 元素从右向左渐变滑入&#xff0c;然后再上下漂浮 代码实现&#xff1a; animation动画可连写 <style lang"less" scoped>//swipe-item里面所有animate动画延迟时间swipe-animation-delay:500ms;//animate.css动画时长animate-css-duration:…

电子电器架构刷写策略 —— 队列刷写

电子电器架构刷写策略 —— 队列刷写 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

关于rocky linux配置RHEL9在线镜像源

Rocky Linux 简介 Rocky Linux 是一个社区支持的企业级 Linux 发行版&#xff0c;旨在为 CentOS Stream 提供一个稳定、可预测的替代方案。它与 CentOS Linux 兼容&#xff0c;并承诺提供 10 年的支持。Rocky Linux 适用于需要一个稳定、可预测的企业级 Linux 发行版&#xff…

算法练习第十二天|二叉树的递归遍历和迭代遍历

二叉树的遍历方式有广度还有深度方式 深度优先遍历&#xff1a;先往深走&#xff0c;遇到叶子节点再往回走。 广度优先遍历&#xff1a;一层一层的去遍历。 本文写的是深度优先遍历&#xff0c;分为前序&#xff0c;中序&#xff0c;后序遍历。这里前中后&#xff0c;其实指的就…

wpf 由于尚未生成某些自定义元素,设计视图无法正确显示。

"WPF 由于尚未生成某些自定义元素&#xff0c;设计视图无法正确显示" 这个问题通常是由于 Visual Studio 设计时的限制或某些资源未正确加载导致的。以下是一些可能的解决方案&#xff1a; 1. 重新生成项目&#xff1a; 尝试重新生成整个项目&#xff0c;以确保所有…