算法数据结构 | 图论基础算法——拓扑排序

蓝桥云课Java B组----最终篇----数据结构+图论 蓝桥杯Java B组 数据结构+图论 阅读详情

今天是算法和数据结构专题的第32篇文章,我们来聊聊拓扑排序的问题。

拓扑排序是图论当中一个非常简单也非常常用的算法,它有很多的功能。它可以用来检测有向图当中是否存在环,也可以用来解决存在依赖的调度问题。下面我们就来看看这个算法的庐山真面目吧。


算法场景


拓扑排序是英文音译,它的英文原文是Topological Sorting,是一个比较抽象的概念,没有很信达雅的翻译。它指的是一个DAG(Directed Acyclic Graph)即有向图所有顶点满足一定条件的线性序列。也就是说图中的这些顶点的排序之间存在一定的逻辑结构和顺序结构,是这两种拧在一起的一个抽象的概念。

那么这些顶点的排序之间应该满足什么样的条件呢?

其实很简单只有两点:

  1. 每个点都只出现一次,这个不用解释了
  2. 如果存在一条从A指向B的边,那么A点在序列中出现的顺序应该在B点之前。关于这点简单解释一下,我们可以把有向边看成一条调度上的依赖。A指向B,即B依赖A,那么显然A应该出现在B前面。就好像淘米 -> 煮饭,我们应该先淘米才能煮饭,煮饭依赖淘米。

比如上图当中1 2 4 3 5就是一个合法的拓扑排序,这个序列满足上面两条性质。


算法原理


那么我们怎么得到这个拓扑排序呢?

其实原理非常简单,就是一个数组的事情。首先,我们用一个数组记录每一个点的入度。所谓的入度也就是有多少点指向它,比如上图当中1号点的入度为0,4号点的入度为2,因为它有1和2两个点指向它。

我们要做的就是根据入度一个点一个点的选择,根据前面说的性质,如果一个点的入度不为0,那么它显然不能被选择。因为至少还有一个点应该在它的前面,既然如此,反过来说也就是我们只能选择入度为0的点。如果所有点的入度都不为0呢?不要问,图中肯定有环,不然一定可以找到一个入度为0的点。关于这点有严谨的证明,但我们也没必要证明了,仔细想想就能想明白。

我们选中了入度为0的点之后呢?之后我们需要把它连出去的边全部删掉,我们一样从调度依赖来思考。比如我们想要做寿司也想要做饭团,这两者都依赖于煮饭。现在饭煮好了,这两者的依赖已经完成了,它们应该不受任何限制了。所以我们要把煮饭连向做饭团和做寿司的边去掉,也就是把依赖去掉。去掉边体现在做饭团和做寿司的入度减一,也就是它们上游的依赖少了一个。

整个流程串起来就是拓扑排序的算法了,怎么样是不是很简单呢?

但是还有一个小问题,根据这样我们得到的序列是唯一的吗?如果存在多个入度为0的点怎么办,我们该选哪一个?

显然拓扑排序的情况可能是不唯一的,但是我们是否要获取所有的情况这一点就要根据实际使用的情况来确定了,一般来说我们只需要一个合法的序列就可以了,如果需要得到所有的拓扑排序也不复杂,我们可以将它看成一个带条件限制的搜索问题,搜索一下所有的可能性就OK了。


代码实现


最后,我们来看下代码,真的是史诗级的简单:

paths = [[], [2, 4], [3, 4], [5], [3, 5], []]

indegree = [0 for _ in range(6)]

for u in range(6):
    for v in paths[u]:
        indegree[v] += 1


topological = set()
for i in range(5):
    for u in range(1, 6):
        if u not in topological and indegree[u] == 0:
            topological.add(u)
            for v in paths[u]:
                indegree[v] -= 1


print(topological)

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

原文链接,求个关注

[数据结构复习]图论 图 文章目录图绪论一笔画问题巧渡河问题逻辑结构定义结构对比概念图的存储邻接矩阵基本思想特点邻接表基本思想十字链表邻接多重表DFS&&BFS连通性生成树最小生成树MSTPrim算法Kruskal 算法拓扑排序AOV网拓扑排序基本思想实现AOE网定义性质事件最早发生时间ve[k]事件的最迟发生时间vl[k]活动的最早开始时间e[i]活动的最晚开始时间l[i]最短路径单源最短路——Dij... 阅读详情

相关推荐

【数据结构】什么是拓扑排序—关于图的拓扑排序

​对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列。拓扑排序:对一个有向图构建拓扑序列的过程。 ​

四季轮换叶,一路招摇胜 8715

拓扑排序(Topological Sorting)

一、什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(DAG)才有拓扑排序,...

dbbaq24022的专栏 4030

图论在数据结构中的应用与图遍历算法

本文介绍了图论中的基本概念及其在多个学科中的应用,探讨了图的不同表示方法和重要算法。包括无向图和有向图的定义、图的遍历方法(深度优先和广度优先算法)、拓扑排序以及图作为数据结构的使用。通过实例和代码示例,深入分析了图在计算机科学中的重要性和应用。

weixin_35238815的博客 345

数据结构——拓扑排序

AOV网(ActivityOnVertexNetwork),AOV是一个有向无环图(Directedacyclicgraph),简称DAG。当这大事足够复杂时,也就是说分成的小事足够多时,我们需要理清思路,找到一个好的方法,来决定事情的先后。也就是说我们不可能完成,找工作之前要有一定的经验,而攒经验之前要找到工作,这实在是矛盾的很。这是一个有环图,我们发现这个环中的结点入度都不为0,因此我们不能找到其一个拓扑排序。比如说,我们上厕所,必须要先拿上手纸(如果你说你不用拿,那当我没说)。......

cdz2470的博客 4895

GEO数据挖掘实战:用R语言从GSE42872数据集中找到关键差异基因(附完整代码)

本文详细介绍了使用R语言从GSE42872数据集中挖掘关键差异基因的完整流程,包括数据下载、探针ID转换、差异表达分析和功能富集分析。通过实战代码演示,帮助生信研究者掌握GEO数据挖掘的核心技术,快速识别疾病相关基因并理解其生物学功能。

weixin_42625070的博客 365

从零开始深入理解 AI Agent(完整版)

AI Agent(智能体)是一个能够自主感知环境、做出决策、执行行动并记忆经验的智能系统。特性传统程序AI Agent决策方式固定逻辑(if-else)动态推理(LLM 思考)灵活性需要重新编程自然语言描述即可能力边界明确限定可通过工具扩展学习能力无可通过记忆积累经验│ 感知 │ ───→ │ 推理 │ ───→ │ 行动 │↑ │ ││ ↓ ││ 记忆 │ ←─── │ 反思 │ ←─────────┘感知(Perception)

qq_20096229的博客 754

【数据结构基础】图 - 拓扑排序(Topological sort)

对于任何有向图而言,其拓扑排序为其所有结点的一个线性排序(对于同一个有向图而言可能存在多个这样的结点排序)。该排序满足这样的条件——对于图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。例如一个有向无环图如下:结点1必须在结点2、3之前结点2必须在结点3、4之前结点3必须在结点4、5之前结点4必须在结点5之前则一个满足条件的拓扑排序为[1, 2, 3, 4, 5]。

DeveloperFire的博客 2684

电子技术设计——16×16点阵汉字显示设计

同时,设计还应注重提升显示品质,以保证汉字的稳定展示和观感舒适。本设计的目的是构建一个能够准确在LED点阵上展示汉字的系统,并允许用户通过输入设备来选择所需的汉字,我们将验证设计方案的实际操作性和效果,以确保其满足设计目标。在LED点阵显示和汉字信息处理技术的结合下,研究者们着手研究如何在LED点阵上有效地显示汉字,并提出了一系列显示算法和优化策略,旨在实现清晰且易于阅读的汉字显示效果。首先,你需要准备16×16的LED点阵面板,通常这些点阵是8×8点阵的两倍,因此可以由两个8×8的点阵组合而成。

weixin_68094467的博客 1532

【数据结构】图的应用之拓扑排序

参考资料:《数据结构(C语言版)严蔚敏著》 版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。 文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。 本文正在施工中...请稍等... 拓扑排序 由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 偏序关系:若集合X上的关系R是自...

WINGREZ‘S BLOG 1720

Windows10检查Cuda和cuDNN是否安装成功?

简介:根据上篇博客已经完成了CUDA和cuDNN的安装步骤,完成对其的安装。下面将来检查它们是否安装成功。 1 .首先win+R进入CMD,在命令行输入nvcc -V,如下图所示,则表示cuda已经安装成功。 2 .进入到cuda的安装路径,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite,找到如下两个.exe文件: 首先执行:deviceQuery.exe,查看是否出现如下界面: 然后执行bandwid

jhsignal的博客 14万+

CCC数字钥匙3.0标准解读(16)

介绍通信过程最重要部分:身份认证和加密.介绍需要身份认证的过程和需要加密的数据及过程.

weixin_41738640的博客 1531

有向图数据结构_算法数据结构 | 图论基础算法——拓扑排序

今天是算法和数据结构专题的第32篇文章,我们来聊聊拓扑排序的问题。拓扑排序是图论当中一个非常简单也非常常用的算法,它有很多的功能。它可以用来检测有向图当中是否存在环,也可以用来解决存在依赖的调度问题。下面我们就来看看这个算法的庐山真面目吧。算法场景拓扑排序是英文音译,它的英文原文是Topological Sorting,是一个比较抽象的概念,没有很信达雅的翻译。它指的是一个DAG(Directed...

weixin_39956451的博客 252

华为OD新系统机试真题 - 失灵的键盘(C/C++/Py/Java/Js/Go)

华为OD新系统机试真题 【失灵的键盘】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD4月15号机试真题【失灵的键盘】

qq_45776114的博客 1064

一个点是否在矩形内的算法_算法数据结构 | 图论基础算法——拓扑排序

今天是算法和数据结构专题的第32篇文章,我们来聊聊拓扑排序的问题。拓扑排序是图论当中一个非常简单也非常常用的算法,它有很多的功能。它可以用来检测有向图当中是否存在环,也可以用来解决存在依赖的调度问题。下面我们就来看看这个算法的庐山真面目吧。算法场景拓扑排序是英文音译,它的英文原文是Topological Sorting,是一个比较抽象的概念,没有很信达雅的翻译。它指的是一个DAG(Directed...

weixin_39870664的博客 79

华为OD技术面真题 - 数据库Redis - 1

汇总华为OD技术面真题Redis方面高频真题,提供详细解答。

qq_45776114的博客 932

2025_NIPS_Grounded Reinforcement Learning for Visual Reasoning

尽管基于思维链的强化学习已在数学、编程等任务中显著提升语言模型性能,但视觉推理面临额外复杂性——需模型引导视觉注意力、解读感知输入,并将抽象推理锚定到空间证据上。本文提出ViGoRL(视觉接地强化学习),这是一种通过强化学习训练的视觉语言模型,能将每个推理步骤明确锚定到特定视觉坐标。受人类视觉决策启发,ViGoRL学会生成空间接地的推理轨迹,在每个步骤引导视觉注意力聚焦任务相关区域。当需要细粒度探索时,我们提出的多轮强化学习框架允许模型随着推理展开动态缩放至预测坐标。

c_cpp_csharp的专栏 58

AcWing算法提高课笔记

Level2 1.动态规划——从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。 Hello Kitty只能向东或向南走,不能向西或向北走。 问Hello Kitty最多能够摘到多少颗花生。 输入格式 第一行是一个整数T,代表一共有多少

m0_72747430的博客 3053

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

基于C++的图论算法分析

浅析图论算法 引言 众所周知,图论在现实中应用广泛,本文旨在巩固本人的数据结构与算法基础,也希望能帮助算法学习者快速理解图论基本算法,现就其作如下浅析。

xingchenkobe123的博客 1836

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法基础课第一部分

关键------画一个仅有整数的一维横轴。

qq_50675813的博客 576

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【知识点总结】【CSP考前复习】图论大杂烩【未完】

OI生涯大汇总.jpg

Cyan_rose 1325

图论之基础算法

//tod

wat1r的博客 201

优秀博客推荐:各种数据结构与算法知识入门经典(不断更新)

转自:http://www.cppblog.com/cxiaojia/archive/2011/11/16/rumen.html

solar一抹阳光的专栏 1273

review(1)基础算法+基础数据结构+基础图论+简单dp

前缀和,快速求出一段区间的和。前缀和计算l-1,差分修改r+1。当遇到一个新元素,二分一下找出结尾小于该数的,,长度最长的序列,然后更新长度+1(和已经求出的长度+1的方案比较)当初看这个的时候感觉好难想啊,,现在看来思路是:找出结尾小于该数长度最长的方案 其实是很自然的。的最长上升子序列所有结尾中,结尾最小min的) 即长度为i的子序列末尾最小元素是什么。注意如果是r=mid-1,,则mid要l+r+1>>1。单调栈:求出第一个小于当前数、大于当前数的数。1.单链表,h,e,ne,idx;

weixin_64197656的博客 580

AOV网与拓扑排序

声明:图片及内容基于:https://www.bilibili.com/video/BV1Wp4y1X79x?from=articleDetail 原理免费优惠券 m.cps3.cn AOV网 拓扑排序 数据结构 核心代码 void ALGraph::TopologicalSort(){ for(int i=0;i<vertexNum;i++){ //in为0则压栈 if(adjList[i].in==0){ .

nidongla的博客 159

国家金融监督管理总局地市级分支局计算机岗国考通关指南:数据结构与算法10讲(第四讲)——图论基础:邻接矩阵、DFS/BFS与拓扑排序

在国家金融监督管理总局地市级分支局计算机岗位的国考中,图(Graph)作为最复杂、最通用的非线性数据结构,是数据结构模块的压轴考点。尽管其出现频率略低于线性表或树(近五年平均每年1–2道),但一旦考查,往往以综合题、程序设计题或算法分析题的形式出现,分值高、难度大,是区分高分考生的关键。更重要的是,图论是理解社交网络分析(如微信好友推荐)、任务依赖调度(如编译工程构建顺序)、路径规划(如导航系统)等现代工程问题的理论基础。而拓扑排序。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 166

a - 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历_数据结构--图

故事凌 今天基本知识点图可说是所有数据结构里面知识点最丰富的一个, 自己笨的知识点如下:阶(oRDER), 度: 出度(out-Degree), 入度(in-Degree)树(Tree), 森林(Forest), 环(Loop)有向图(Directed Graph), 无向图(Undirected Graph), 完全有向图, 完全无向图连通图(Connected Graph), 连通分量(Con...

weixin_30424461的博客 628
上一篇: 机器学习 | 深入SVM原理及模型推导(一)
下一篇: 数据处理 | pandas入门专题——离散化与one-hot
TechFlow
博客等级 码龄7年 347粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值