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

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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

ubuntu 远程桌面及Qt安装

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

awk分割字符

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

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

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

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

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

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

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

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

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

对于嵌入式交叉编译总结

这几天终于搞定了老师项目里我负责的部分,主要是做一个图像采集的手持端,我选用了JZ2440。 从移植内核、制作文件系统、Qt移植总结下来发现在对于代码的交叉编译必须保证编译平台的一致性。对于s3c2440来说是armv4t,所以当我们编译出来程序必…

linux驱动调试--oops信息

在移植dm9000 时被一个错误困扰了很久,当时手里只有printk调试手段,觉得自己应该升级下了,先学习了根据oops信息来调试。 先构造一个错误,insmod后抛出如下信息 我们着重看这几句 PC is at memcpy0x8c/0x29c c0148080 pc : …

浏览器输入网址后发生了什么?

摘自:这是最全的一篇!!!浏览器输入网址后发什么了什么? 作者:程序员cxuan 发布时间: 2021-04-15 11:59:07 网址:https://blog.csdn.net/qq_36894974/article/details/115720479 到现…

fancybox去除不受待见的水平滚动条

用fancybox在嵌套某个页面时,有时莫名其妙的会出现的消除不掉的幽灵般水平滚动条,如何去除: github上的解决方案:https://github.com/fancyapps/fancyBox/issues/24 转载于:https://www.cnblogs.com/kinpauln/p/3145796.html

Word Count作业

Word Count作业 一.个人Gitee地址&#xff1a;https://gitee.com/Changyu-Guo 二.项目简介 该项目主要是模拟Linux上面的wc命令&#xff0c;基本要求如下&#xff1a; 命令格式&#xff1a; wc.exe [para] <filename> [para] <filename> ... -o <filename> 功…

iDempiere = OSGi + ADempiere 一款ERPCRMSCM系统、助力中小企业发展

怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建。http://osssme.org/ iDempiere OSGi ADempiere 一款ERP&CRM&SCM系统、助力中小企业发展 一句话概括iDempiere是一款基于Compiere/ADempiere的​开源企业级ERP&CRM&SCM系统​&…

字符串 hash 唯一数字_【数字课堂】酒妹带你了解“身份认证技术”

身份认证技术是在计算机网络中确认操作者身份的过程而产生的有效解决方法。计算机网络世界中一切信息包括用户的身份信息都是用一组特定的数据来表示的&#xff0c;计算机只能识别用户的数字身份&#xff0c;所有对用户的授权也是针对用户数字身份的授权。如何保证以数字身份进…

空气中超声衰减

空气中超声衰减是非常厉害的&#xff0c;这导致在空气耦合声换能器的制作或是声传感器的设计是极具挑战的&#xff0c;因此对超声衰减做一个细致的分析是很有必要的。 具体计算根据经验公式如下进行计算 结果如下&#xff1a; Figure 1 超声衰减系数与频率关系图 Figure 2 超声…

java生产者消费者问题代码分析

作者要的是一个生产者生成&#xff0c;接着必须有一个消费者消费&#xff0c;那这不是需要单线程吗&#xff1f;或者使用1个大小的阻塞队列。所以只谈论问题本身&#xff0c;不谈论好不好。 具体代码&#xff1a; Java代码 import java.util.concurrent.locks.Condition; i…

可以ping通 但ssh: connect to host 192.168.0.2 port 22: Connection refused

目录问题描述原因解决问题描述 自己在树莓派端通过SCP指令给电脑上ubuntu传输文件发现提示&#xff1a;ssh: connect to host 192.168.0.2 port 22: Connection refused&#xff0c;并且发现树莓派端是可以ping通ubuntu的。 原因 通过网上查新找到原因&#xff1a; SSH分客…