判断图有无环_浅谈什么是图拓扑排序

d1ff771413de4cfdd51ab56153434532.png

1 引言

  在工程实践中,一个工程项目往往由若干个子项目组成。这些子项目间往往有两种关系:
  (1) 先后关系,即必须在某个项完成后才能开始实施另一个子项目。
  (2) 子项目间无关系,即两个子项目可以同时进行,互不影响。

  例如:在工厂里产品的生产线上,一个产品由若干个零部件组成。零部件生产时,也存在这两种关系:
  (1)先后关系,即一个部件必须在完成后才能生产另一个部件;
  (2)部件间无先后关系,即这两个部件可以同时生产。
  那么如何合理的分配资源才能保证工程能够按时完成呢?将任务作为图的顶点,将任务之间的依赖关系作为图的边,这样就可以将实际问题抽象为数据结构图论中的典型问题——图的拓扑排序。

2 重要概念

  有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环。常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度。AOV网:在每一个工程中,可以将工程分为若干个子工程,这些子工程称为活动。如果用图中的顶点表示活动,以有向图的弧表示活动之间的优先关系,这样的有向图称为AOV网,即顶点表示活动的网。在AOV网中,如果从顶点vi到顶点j之间存在一条路径,则顶点vi是顶点vj的前驱,顶点vj是顶点vi的后继。活动中的制约关系可以通过AOV网中的表示。 在AOV网中,不允许出现环,如果出现环就表示某个活动是自己的先决条件。因此需要对AOV网判断是否存在环,可以利用有向图的拓扑排序进行判断。拓扑序列:设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,…,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前,则我们称这样的顶点序列为一个拓扑序列。拓扑排序:拓扑排序是对一个有向图构造拓扑序列的过程。

3 拓扑排序

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

4 入度表法

  入度表法是根据顶点的入度来判断是否存在依赖关系。若顶点入度不为0。则必然此顶点的事件有前驱依赖事件,因此每次选取入度为0的顶点输出,则符合拓扑排序的性质。

4.1 算法流程

(1)从图中选择一个入度为0的顶点,输出该顶点。
(2)从图中删除该节点及其所有出边(即与之邻接的所有顶点入度-1)
(3)反复执行这两个步骤,直至所有节点都输出,即整个拓扑排序完成;或者直至剩下的图中再没有入度为0的节点,这就说明此图中有回路,不可能进行拓扑排序。

4.2 实例图解

例如:图4.2.1所示的有向无环图,采用入度表的方法获取拓扑排序过程。

d8eac875b395b99581259adff9fbc3ec.png
4.2.1

(1)选择图中入度为0的顶点1,输出顶点1。删除顶点1,并删除以顶点1为尾的边。删除后图为:
839c9bd92dc633446ce803058b2a6057.png

(2)继续选择入度为0的顶点。现在,图中入度为0的顶点有2和4,这里我们选择顶点2,输出顶点2。删除顶点2,并删除以顶点2为尾的边。删除后图为:
8a7be50f6c787ce6671b910951758e6a.png

(3)选择入度为0的顶点4,输出顶点4.删除顶点4,并删除以顶点4为尾的边。删除后图为:
8e0255ada2bec575b3571bfc243c4590.png

(4)选择入度为0的顶点3,输出顶点3.删除顶点3,并删除以顶点3为尾的边。删除后图为:
24650c104047d27403fdeafa713d48ce.png

(5)最后剩余顶点5,输出顶点5,拓扑排序过程结束。最终的输出结果为:
e2db14c0979b9b27bd723e57bb5c73ae.png

4.3 性能分析

  算法时间复杂度分析:统计所有节点入度的时间复杂性为(VE);接下来删边花费的时间也是(VE),总花费时间为O(VE)。若使用队列保存入度为0的顶点,则可以将这个算法复杂度将为O(V+E)。

5 DFS方法

  深度优先搜索过程中,当到达出度为0的顶点时,需要进行回退。在执行回退时记录出度为0的顶点,将其入栈。则最终出栈顺序的逆序即为拓扑排序序列。

5.1 算法流程

(1)对图执行深度优先搜索。
(2)在执行深度优先搜索时,若某个顶点不能继续前进,即顶点的出度为0,则将此顶点入栈。
(3)最后得到栈中顺序的逆序即为拓扑排序顺序。

5.2 实例图解

例如图5.2.1所示的有向无环图,采用DFS的方法获取拓扑排序过程。

c73a632108f6873100fa78b02c722ff5.png
5.2.1

(1)选择起点为顶点1,,开始执行深度优先搜索。顺序为1->2->3->5。
65c66953559694b3933b418d79279169.png

(2)深度优先搜索到达顶点5时,顶点5出度为0。将顶点5入栈。
8e068d751690cf728ce3f5da292625ea.png

(3)深度优先搜索执行回退,回退至顶点3。此时顶点3的出度为0,将顶点3入栈。
76e638e12cf4a2b2035d7cf1040044e2.png

(4)回退至顶点2,顶点2出度为0,顶点2入栈。
faf96d25e929275482a91bc2ee32bac1.png

(5)回退至顶点1,顶点1可以前进位置为顶点4,顺序为1->4。
11593e62a6f1cad465676262fcb29528.png

(6)顶点4出度为0,顶点4入栈。
b6831fabfcaf5f5e536d6500611a503d.png

(7)回退至顶点1,顶点1出度为0,顶点1入栈。
7f59006a8e0bbb6b54d11b6c0b9af37a.png

(8)栈的逆序为1->4->2->3->5。此顺序为拓扑排序结果。

5.3 性能分析

  时间复杂度分析:首先深度优先搜索的时间复杂度为O(V+E),而每次只需将完成访问的顶点存入数组中,需要O(1),因而总复杂度为O(V+E)。

推荐阅读

拜托,面试官别问我「布隆」了

有点难度,几道和「滑动窗口」有关的算法面试题

数据结构与算法:三十张图弄懂「图的两种遍历方式」

昨天,终于拿到了腾讯 offer

几道和「二叉树」有关的算法面试题

几道和散列(哈希)表有关的面试题

一道看完答案你会觉得很沙雕的「动态规划算法题」

几道和「堆栈、队列」有关的面试算法题

链表算法面试问题?看我就够了!

我就知道你在看!

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

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

相关文章

排列与组合的Java递归实现 (参考)

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc&…

【php】 自带的过滤机制

<?php print_r(filter_list()); ?>输出类似&#xff1a; Array ( [0] > int [1] > boolean [2] > float [3] > validate_regexp [4] > validate_url [5] > validate_email [6] > validate_ip [7] > string [8] > stripped [9] > encoded…

Source Insight 4.0安装教程(PS:附安装包及卸载重新安装等注意事项)

目录一、Source Insight 4.0安装包二、删除配置文件&#xff08;初次安装忽略此步骤&#xff09;1、清除注册表信息&#xff1a;2、删除全局配置信息&#xff1a;三、安装步骤1、解压2、安装3、替换4、破解5、安装提示unable to open or create...解决方案一、Source Insight 4…

通过远程(vnc)无法打开qtcreator

最近打算移植qt程序到板子上于是&#xff0c;在ubuntu物理机上装了qt开发环境&#xff0c;通过远程桌面链接上去写qt。 但是远程老是点不开qtcreator。于是通过命令行启动 出了报错信息&#xff0c;应该和xserver 服务有关&#xff0c;没有深入了解错误 下面是我的解决方案&a…

tomcat限速_网络限速

基本介绍上下行速度上行就是上传的速度,下行就是下载的速度,上行速率一般是指从你的电脑上传的速度&#xff0c;也就说别人从你的电脑进行通讯的速率&#xff01;下行速率一般是你从网络上的主机下载速度&#xff01;我们访问互联网的过程中存在这两种行为&#xff1a;一是上传…

iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局

iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一、项目文件结构和plist文件 二、实现效果 三、代码示例 1.没有使用配套的类&#xff0c;而是直接使用xib文件控件tag值…

硬件模块化开发的例子:LD3320语音模块与Source Insight的使用

目录硬件模块化开发的行情LD3320语音模块使用手册介绍&#xff1a;语音模块验货测试硬件连接效果图测试结果良好Source Insight代码查看器创建工程修改字体配色方案中文乱码关联代码语音识别模块代码分析语音识别模块二次开发硬件模块化开发的行情 LD3320语音模块使用手册介绍&…

ubuntu 远程桌面及Qt安装

环境&#xff1a; ubunut14 x64 目标&#xff1a;通过vnc远程桌面&#xff0c;在ubuntu 上编写qt程序 1.安装远程桌面 apt-get install xrdp vnc4server xbase-clients dconf-editor #安装xrdp&#xff0c;vnc4server apt-get install gnome-panel gnome-settings-daemon m…

awk分割字符

为什么80%的码农都做不了架构师&#xff1f;>>> str1|_|2|_|3|_||_|4|_|5|_|6|_||_|7|_|8|_|9; 期望分割成 1|_|2|_|3 4|_|5|_|6 7|_|8|_|9 也就是以|_||_|做分割符&#xff0c;但是&#xff0c;字符段长度不确定&#xff0c;有可能分割成3段&#xff0c;也可能会有…

面经——嵌入式软件工程师面试遇到的经典题目

参考&#xff1a;嵌入式软件工程师面试遇到的经典题目 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-11-04 23:43:16 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109499825 目录1、找错误2、下面的代码输出是什么&#xff0c;为什么&am…

axure实现复选框全选_AxureRP8实战手册-案例73(全选与取消全选效果)

案例73. 全选与取消全选效果案例来源:百度音乐-音乐盒案例效果&#xff1a;初始状态/取消全选时&#xff1a;(图5-117)全选后取消任一选项时&#xff1a;(图5-118)全选/单选全部选中时&#xff1a;(图5-119)案例描述&#xff1a;列表中相邻的行具有交替的背景颜色&#xff1b;点…

移植Linux3.4.2版本内核到mini2440

一. 内核启动流程&#xff0c;据此配置内核(机器ID) 1. 获取内核源码 www.kernel.org https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.2.tar.bz2 2. 解压内核 # tar xjvf linux-3.4.2.tar.bz2 3. 修改顶层Makefile&#xff0c;指定交叉编译器 ARCH ? arm CRO…

在浏览器的背后(二) —— HTML语言的语法解析

当你看到这篇文章意味着我辜负了教主的殷切期望周末木有去约会&#xff0c;以及苏老师我思故我在北京鼓楼的落井下石成功了…… 本文demo powered by 已经结婚的老赵的不再维护的wind.js 物是人非啊…… 说回正经事&#xff0c;在上一篇文章中&#xff0c;我们取得了初步成果&a…

面经——小米面经(2021春招)

摘自&#xff1a;小米面经&#xff08;2021春招&#xff09;——感谢小米、感谢雷总、感谢上官可编程 作者&#xff1a;阿波罗啦啦啦啦 发布时间&#xff1a; 2021-05-01 11:08:41 网址&#xff1a;https://blog.csdn.net/weixin_44933419/article/details/116325554 3月31日投…

使用arm混合汇编计算两个64位的和_混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用...

12.4C target_blank stylecursor:pointer;color:#D05C38;text-decoration:underline;>C、C和ARM汇编语言之间的调用本节提供一些示例&#xff0c;显示如何从C调用C和汇编语言代码&#xff0c;以及从C和汇编语言调用C代码。其中包括调用约定和数据类型。主要包括下面内容&…

记一次用WPScan辅助渗透WordPress站点

记一次用WPScan辅助渗透WordPress站点 一、什么是WPScan&#xff1f; WPScan 是一个扫描 WordPress 漏洞的黑盒子扫描器&#xff0c;它可以为所有 Web 开发人员扫描 WordPress 漏洞并在他们开发前找到并解决问题。我们还使用了 Nikto &#xff0c;它是一款非常棒的 Web 服务器评…

移植tslib(s3c2440)

解压安装tslib # tar -zxvf tslib-1.4.tar.gz # cd tslib # ./autogen.sh #echo “ac_cv_func_malloc_0 _nonnullyes”>arm-linux.cache # ./configure –hostarm-linux –cache-filearm-linux.cache -prefix/usr/local/tslib ac_cv_func_malloc_0_nonnullyes # make …

什么是Cortex、ARMv8、arm架构、ARM指令集、soc

参考&#xff1a;到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc&#xff1f;一文帮你梳理基础概念【科普】 发布时间&#xff1a; 一口Linux 网址&#xff1a;https://blog.csdn.net/daocaokafei/article/details/109008103 目录前言1. ARM公司2. ARM内核与架构1&#xff…

Windows下Qt5搭建Android开发环境笔记

Windows很大的特点是配置使用几乎都可以图形化进行&#xff0c;和Linux比起来在很多时候配置环境也要方便很多。所以&#xff0c;搭建Qt for Andorid也是十分简单的。需要以下工具&#xff1a;1.最方便的Qt官方包&#xff0c;现在还处于RC阶段&#xff0c;经过测试也是有些小bu…

大学python怎么过_大学生该不该学Python?太纠结了?

首先&#xff0c;在大学期间的学习任务应该围绕自身的专业课程体系来展开&#xff0c;对于计算机相关专业的同学来说&#xff0c;学习Python还是有一定必要的&#xff0c;作为一门全场景编程语言&#xff0c;Python在大数据、人工智能等领域的应用还是比较广泛的&#xff0c;掌…