拓扑排序

合集下载

dfs实现拓扑排序原理

dfs实现拓扑排序原理

拓扑排序拓扑排序是一种对有向无环图(DAG)进行排序的算法,它可以将图中的节点按照一定的顺序进行排列。

拓扑排序算法常用于任务调度、依赖关系分析等领域。

拓扑排序的基本原理是通过深度优先搜索(DFS)来遍历图中的节点,并根据节点的访问顺序进行排序。

在DFS过程中,首先从某个节点出发,沿着一条路径一直访问下去,直到无法继续访问为止。

然后回溯到上一个节点,继续访问未被访问过的邻接节点。

这样不断地递归下去,直到所有节点都被访问过为止。

拓扑排序算法的基本步骤如下:1.创建一个空的结果列表,用于存储排序后的节点。

2.选择一个未被访问过的节点作为起始节点。

3.从起始节点开始进行DFS遍历,将访问到的节点标记为已访问。

4.在DFS遍历过程中,如果遇到某个节点的所有邻接节点都已经被访问过,则将该节点加入结果列表。

5.继续选择下一个未被访问过的节点作为起始节点,重复步骤3和步骤4,直到所有节点都被访问过。

6.返回结果列表,即为拓扑排序的结果。

下面通过一个具体的例子来说明拓扑排序的原理。

假设有如下的有向无环图(DAG):A ->B -> C| |v vD -> E首先选择一个未被访问过的节点作为起始节点,假设选择节点A。

从节点A开始进行DFS遍历,首先访问节点A,并将其标记为已访问。

接下来访问节点A的邻接节点B,然后继续访问节点B的邻接节点C。

由于节点C没有邻接节点,所以将节点C加入结果列表,并回溯到节点B。

接着访问节点B的另一个邻接节点E,将节点E 加入结果列表。

然后回溯到节点A,继续访问节点A的另一个邻接节点D,将节点D加入结果列表。

最后回溯到节点A,节点A的所有邻接节点都已经被访问过,将节点A加入结果列表。

此时,结果列表中的节点顺序为C、E、D、A。

但是根据拓扑排序的定义,结果列表应该是一个满足所有依赖关系的顺序。

在这个例子中,节点B依赖于节点A,所以节点B应该在节点A之后。

为了达到这个目的,可以将结果列表中的节点顺序反转,得到最终的拓扑排序结果为A、D、E、C、B。

拓扑排序例子 -回复

拓扑排序例子 -回复

拓扑排序例子-回复什么是拓扑排序?为什么要进行拓扑排序?如何进行拓扑排序?这篇文章将为你逐步解答这些问题。

拓扑排序是一种用于有向无环图(DAG)的算法,它将图中的节点按照一种特定的顺序进行排序。

拓扑排序往往用于解决有依赖关系的任务调度问题,其中任务的执行必须按照一定的顺序。

通过拓扑排序,我们可以确定任务的执行顺序,确保每个任务在它所依赖的任务执行完毕之后再执行。

那么为什么要进行拓扑排序呢?想象一下,你要为一本书编写目录,你希望按照章节的顺序来编写目录,否则读者可能会迷失在无序的章节中。

在这个例子中,每个章节都相当于一个任务,它们之间存在一定的依赖关系,因为后续的章节可能会引用之前的内容。

通过拓扑排序,你可以确定每个章节的先后顺序,确保目录的编写顺利进行。

那么如何进行拓扑排序呢?拓扑排序使用了一种叫做“深度优先搜索”的算法。

算法从一个未访问的节点开始遍历图,当遍历到一个节点时,它将其标记为已访问,并继续遍历该节点的所有邻接节点。

当一个节点的所有邻接节点都被访问完毕后,它将被添加到排序结果的头部。

最终,我们得到的排序结果就是拓扑排序的结果。

下面,我们来举一个具体的例子来演示拓扑排序的过程。

假设我们有以下的任务依赖关系图:[1] > [2] > [4]\\ v> [3] > [5]在这个图中,节点表示任务,箭头表示任务之间的依赖关系。

例如,节点2依赖于节点1,节点4依赖于节点2,等等。

我们的目标是按照依赖关系的顺序对节点进行排序。

首先,我们从一个未访问的节点开始,假设我们选择节点1。

我们接下来需要遍历节点1的所有邻接节点,即节点2和节点3。

然后,我们继续遍历这两个节点的邻接节点,依次为节点4和节点5。

由于节点4和节点5都没有邻接节点,它们被添加到排序结果的头部。

接着,我们回溯到节点2,它的邻接节点3已经被访问过了,所以它也被添加到排序结果的头部。

最后,我们回溯到节点1,将其添加到排序结果的头部。

什么是拓扑排序?

什么是拓扑排序?

什么是拓扑排序?
拓扑排序是一种对有向无环图(DAG)进行排序的算法,它可以将图中的顶点
按照一定的顺序排列,使得图中任意一条边的起点在排列中都出现在终点之前。

具体来说,拓扑排序的过程是这样的:
1. 首先,找到图中入度为0的顶点(即没有任何边指向它的顶点),将其加入到排序的结果中。

2. 然后,移除这个顶点以及由它出发的所有边,更新剩余顶点的入度。

3. 重复以上步骤,直到所有的顶点都被加入到排序结果中或者发现图中存在环。

如果最终所有的顶点都被加入到排序结果中,那么这个排序就是图的一个拓扑
排序;如果在过程中发现了环,那么图不具有拓扑排序。

拓扑排序的应用非常广泛,比如在软件工程中可以用来解决模块的依赖关系,
或者在任务调度中确定任务的执行顺序等等。

这个算法的时间复杂度为O(V+E),其中V为顶点的数量,E为边的数量。

图基本算法拓扑排序(基于dfs)

图基本算法拓扑排序(基于dfs)

图基本算法拓扑排序(基于dfs) 拓扑排序,是对有向⽆回路图进⾏排序,以期找到⼀个线性序列,这个线性序列在⽣活正可以表⽰某些事情完成的相应顺序。

如果说所求的图有回路的话,则不可能找到这个序列。

在⼤学数据结构课上,我们知道求拓扑排序的⼀种⽅法。

⾸先⽤⼀个⼊度数组保存每个顶点的⼊度。

在进⾏拓扑排序时,我们需要找到⼊度为0的点,将其存⼊线性序列中,再将其从图中删除(与它相关的边都删除,相邻的顶点的⼊度均减1),再重复上⾯的操作,直⾄所有的顶点都被找到为⽌。

如果不对每次找⼊度为0的顶点的⽅法进⾏处理,⽽直接去遍历⼊度数组,则该算法的时间复杂度为O(|V|2),如果使⽤⼀个队列来保存⼊度为0的顶点,则可以将这个算法的复杂度降为O(V+E)。

今天在算法导论上看了⽤dfs来求拓扑排序的算法,才发现其⾼深之处,膜拜之Orz…下⾯是算法导论的叙述: 本节说明了如何运⽤深度优先搜索,对⼀个有向⽆回路图(dag)进⾏拓扑排序。

对有向⽆回路图G=(V,E)进⾏拓扑排序后,结果为该图顶点的⼀个线性序列,满⾜如果G包含边(u, v),则在该序列中,u就出现在v的前⾯(如果图是有回路的,就不可能存在这样的线性序列)。

⼀个图的拓扑排序可以看成是图中所有顶点沿⽔平线排列⽽成的⼀个序列。

使得所有的有向边均从左指向右。

因此,拓扑排序不同于通常意义上的排序。

在很多应⽤中,有向⽆回路图⽤于说明时间发⽣的先后次序,下图1即给出⼀个实例,说明Bumstead教授早晨穿⾐的过程。

他必须先穿好某些⾐服,才能再穿其他⾐服(如先穿袜⼦后穿鞋),其他⼀些⾐服则可以按任意次序穿戴(如袜⼦和裤⼦),在图1中,有向边<u,v>表⽰⾐服u必须先于⾐服v穿戴。

因此,该图的拓扑排序给出了⼀个穿⾐的顺序。

图2说明了对该图进⾏拓扑排序后,将沿⽔平线⽅向形成⼀个顶点序列,使得图中所有有向边均从左指向右。

拓扑排序算法具体步骤如下:1、调⽤dfs_travel();2、在dfs_travel()每次调⽤dfs()的过程中,都记录了顶点s的完成时间,将顶点s按完成顺序保存在存放拓扑排序顺序的数组topoSort[]中。

拓扑排序应用场景

拓扑排序应用场景

拓扑排序应用场景拓扑排序是一种常用的图算法,用于解决一些特定的应用场景。

它的主要作用是对有向无环图(DAG)中的节点进行排序,使得所有的边从前向后指向排列的顺序。

在实际应用中,拓扑排序被广泛应用于任务调度、依赖关系分析、编译优化等领域。

在任务调度中,拓扑排序可以用来确定任务的执行顺序。

假设有一组任务,每个任务都有一些依赖关系,即某些任务必须在其他任务执行之后才能开始。

这时候,我们可以将任务看作图中的节点,依赖关系看作图中的边,利用拓扑排序算法确定任务的执行顺序。

通过拓扑排序,我们可以确保没有任务在其依赖任务执行之前开始,从而保证任务的正确执行。

拓扑排序也可以应用于依赖关系分析。

在软件开发中,各个模块之间可能存在依赖关系,即某些模块需要依赖其他模块的输出结果才能正常工作。

通过使用拓扑排序,可以分析模块之间的依赖关系,找出模块之间的依赖顺序,从而保证软件的正确运行。

另一个应用场景是编译优化。

在编译过程中,源代码会经过多个阶段的处理,例如词法分析、语法分析、语义分析等。

这些处理过程之间也存在依赖关系,必须按照一定的顺序进行。

通过拓扑排序,可以确定编译过程中各个阶段的执行顺序,从而提高编译的效率和准确性。

除了上述应用场景,拓扑排序还可以用于解决其他问题。

例如,可以用拓扑排序来判断一个有向图是否存在环路,如果拓扑排序中存在环路,则图中存在环路;反之,如果拓扑排序中不存在环路,则图中不存在环路。

此外,拓扑排序还可以用于确定关键路径,即在一组任务中找出耗时最长的路径,从而可以优化任务的执行时间。

拓扑排序是一种非常实用的图算法,广泛应用于任务调度、依赖关系分析、编译优化等领域。

通过拓扑排序,可以确定任务的执行顺序,分析模块之间的依赖关系,优化编译过程,判断图中是否存在环路,确定关键路径等。

这些应用场景都可以通过拓扑排序来解决,从而提高工作效率和准确性。

详解C++实现拓扑排序算法

详解C++实现拓扑排序算法

详解C++实现拓扑排序算法⽬录⼀、拓扑排序的介绍⼆、拓扑排序的实现步骤三、拓扑排序⽰例⼿动实现四、拓扑排序的代码实现五、完整的代码和输出展⽰⼀、拓扑排序的介绍拓扑排序对应施⼯的流程图具有特别重要的作⽤,它可以决定哪些⼦⼯程必须要先执⾏,哪些⼦⼯程要在某些⼯程执⾏后才可以执⾏。

为了形象地反映出整个⼯程中各个⼦⼯程(活动)之间的先后关系,可⽤⼀个有向图来表⽰,图中的顶点代表活动(⼦⼯程),图中的有向边代表活动的先后关系,即有向边的起点的活动是终点活动的前序活动,只有当起点活动完成之后,其终点活动才能进⾏。

通常,我们把这种顶点表⽰活动、边表⽰活动间先后关系的有向图称做顶点活动⽹(Activity On Vertex network),简称AOV⽹。

⼀个AOV⽹应该是⼀个有向⽆环图,即不应该带有回路,因为若带有回路,则回路上的所有活动都⽆法进⾏(对于数据流来说就是死循环)。

在AOV⽹中,若不存在回路,则所有活动可排列成⼀个线性序列,使得每个活动的所有前驱活动都排在该活动的前⾯,我们把此序列叫做拓扑序列(Topological order),由AOV⽹构造拓扑序列的过程叫做拓扑排序(Topological sort)。

AOV⽹的拓扑序列不是唯⼀的,满⾜上述定义的任⼀线性序列都称作它的拓扑序列。

⼆、拓扑排序的实现步骤1.在有向图中选⼀个没有前驱的顶点并且输出2.从图中删除该顶点和所有以它为尾的弧(⽩话就是:删除所有和它有关的边)3.重复上述两步,直⾄所有顶点输出,或者当前图中不存在⽆前驱的顶点为⽌,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断⼀个图是否有环。

三、拓扑排序⽰例⼿动实现如果我们有如下的⼀个有向⽆环图,我们需要对这个图的顶点进⾏拓扑排序,过程如下:⾸先,我们发现V6和v1是没有前驱的,所以我们就随机选去⼀个输出,我们先输出V6,删除和V6有关的边,得到如下图结果:然后,我们继续寻找没有前驱的顶点,发现V1没有前驱,所以输出V1,删除和V1有关的边,得到下图的结果:然后,我们⼜发现V4和V3都是没有前驱的,那么我们就随机选取⼀个顶点输出(具体看你实现的算法和图存储结构),我们输出V4,得到如下图结果:然后,我们输出没有前驱的顶点V3,得到如下结果:然后,我们分别输出V5和V2,最后全部顶点输出完成,该图的⼀个拓扑序列为:v6–>v1—->v4—>v3—>v5—>v2四、拓扑排序的代码实现下⾯,我们将⽤两种⽅法来实现我么的拓扑排序:1.Kahn算法2.基于DFS的拓扑排序算法⾸先我们先介绍第⼀个算法的思路:Kahn的算法的思路其实就是我们之前那个⼿动展⽰的拓扑排序的实现,我们先使⽤⼀个栈保存⼊度为0 的顶点,然后输出栈顶元素并且将和栈顶元素有关的边删除,减少和栈顶元素有关的顶点的⼊度数量并且把⼊度减少到0的顶点也⼊栈。

拓扑排序及关键路径

拓扑排序及关键路径

2.有向图在实际问题中的应用 一个有向图可以表示一个施工流程图,或产品生产流程
图,或数据流图等。设图中每一条有向边表示两个子工程之 间的先后次序关系。
若以有向图中的顶点来表示活动,以有向边来表示活动 之间的先后次序关系,则这样的有向图称为顶点表示活动的 网 (Activity On Vertex Network),简称AOV网。
这样,每个活动允许的时间余量就是l(i) - e(i)。而关键活动 就是l(i) - e(i) = 0的那些活动,即可能的最早开始时间e(i)等于 允许的最晚开始时间l(i)的那些活动就是关键活动。
4.寻找关键活动的算法 求AOE网中关键活动的算法步骤为: (1)建立包含n+1个顶点、e条有向边的AOE网。其中,顶
(4)从汇点vn开始,令汇点vn的最晚发生时间vl[n]=ve[n], 按逆拓扑序列求其余各顶点k(k=n-1,n-2,…,2,1,0)的最晚发生 时间vl[k];
(5)计算每个活动的最早开始时间e[k] (k=1,2,3,…,e); (6)计算每个活动的最晚开始时间l[k] (k=1,2,3,…,e); (7)找出所有e[k]= l[k]的活动k,这些活动即为AOE网的 关键活动。
上述算法仅能得到有向图的一个拓扑序列。改进上述 算法,可以得到有向图的所有拓扑序列。
如果一个有向图存在一个拓扑序列,通常表示该有向 图对应的某个施工流程图的一种施工方案切实可行;而 如果一个有向图不存在一个拓扑序列,则说明该有向图 对应的某个施工流程图存在设计问题,不存在切实可行 的任何一种施工方案。
事件可能的最早开始时间υe(k):对于顶点υk代表的事件, υe(k)是从源点到该顶点的最大路径长度。在一个有n+1个事 件的AOE网中, 源点υ0的最早开始时间υe(0)等于0。事件υk (k=1,2,3,…,n)可能的最早开始时间υe(k)可用递推公式表 示为:

拓扑排序求最长路径

拓扑排序求最长路径

拓扑排序求最长路径1. 什么是拓扑排序?拓扑排序是对有向无环图(DAG)进行排序的一种算法。

在有向图中,如果存在一条从节点A到节点B的有向边,那么节点A就必须在节点B之前进行排序。

拓扑排序通过将图中的节点按照一定的顺序进行排列,使得任意两个节点之间不存在环。

拓扑排序可以应用于许多问题,比如任务调度、依赖关系分析等。

2. 拓扑排序算法2.1. 算法原理拓扑排序算法基于深度优先搜索(DFS)或广度优先搜索(BFS)实现。

其基本思想是通过遍历图中的所有节点,并记录每个节点的入度(即指向该节点的边数)。

然后从入度为0的节点开始遍历,并将其加入结果列表中。

然后将与该节点相邻的节点的入度减1,并将新入度为0的节点加入结果列表。

重复此过程直到所有节点都被加入结果列表。

2.2. 算法步骤以下是拓扑排序算法的详细步骤:1.初始化一个空结果列表result和一个空队列queue。

2.遍历图中所有节点,并统计每个节点的入度。

3.将入度为0的节点加入队列queue。

4.当队列queue不为空时,执行以下步骤:–从队列queue中取出一个节点node,并将其加入结果列表result。

–遍历与节点node相邻的所有节点,并将它们的入度减1。

–如果某个节点的入度减为0,则将其加入队列queue。

5.如果结果列表result的长度等于图中的节点数,则说明拓扑排序成功;否则,说明图中存在环。

以下是使用Python语言实现拓扑排序算法的示例代码:from collections import defaultdict, dequedef topological_sort(graph):# 统计每个节点的入度in_degree = defaultdict(int)for node in graph:for neighbor in graph[node]:in_degree[neighbor] += 1# 初始化结果列表和队列result = []queue = deque()# 将入度为0的节点加入队列for node in graph:if in_degree[node] == 0:queue.append(node)# 拓扑排序while queue:node = queue.popleft()result.append(node)for neighbor in graph[node]:in_degree[neighbor] -= 1if in_degree[neighbor] == 0:queue.append(neighbor)if len(result) == len(graph):return resultelse:return None3. 拓扑排序求最长路径在有向无环图中,求最长路径可以通过拓扑排序算法来实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

v4
a6=2
v6
v9
0 18
0 6 18 6
0 4 18 6
0 5 18 8
0 7 18 7
0 0 0 0 7 15 14 18 18 18 18 18 10 16 14
如何求关键路径
V2 v1
0, 0 6, 6
v7
15, 16
v5 V3
4, 6 7, 7
v9
v8
14, 14
18, 18
v4
5, 8
拓扑排序---方法2 拓扑排序 方法2
void DFS-T(Graph G, int v) {
// 从顶点 出发,深度优先搜索遍历连通图 G 从顶点v出发 出发,
visited[v] = TRUE; for(w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G,v,w)) {if (!visited[w]) DFS-T(G, w);}
DAG图 图
有环的有向图
有向无环图
二、如何判断一个图是否是DAG? 如何判断一个图是否是DAG? DAG
V1 V2 V4 V8 V5 V6 V3 V7
深度优先搜索没有出现指 向祖先的回边,即: 没有一个顶点有一条边, 指向遍历过程中先访问过 的顶点(并且这些顶点的 DFS函数没有执行完)
DAGቤተ መጻሕፍቲ ባይዱ 图
拓扑排序
一、定义
由集合上的一个偏序关系得到集合的全序关系的 操作 偏序:自反的、反对称的、传递的 偏序:自反的、反对称的、 全序: 是集合X上的偏序,对于集合X 全序:R是集合X上的偏序,对于集合X中的任何 元素x,y 如果都有xRy或者yRx,则称R x,y, xRy或者yRx,则称 元素x,y,如果都有xRy或者yRx,则称R是全序关 系
拓扑排序---方法1 拓扑排序 方法1
c a g b h 拓扑序列:b 拓扑序列: f d e
h a cdg f e
拓扑排序---方法1 拓扑排序 方法1
在算法中需要用定量的描述替代定性的概念 没有前驱的顶点 入度为零的顶点 弧头顶点的入度减1
删除顶点及以它为尾的弧
拓扑排序---算法 拓扑排序
有向无环图
Bool DFS-DAG(Graph G, int v) { // 从顶点v出发,深度优先搜索遍历连通图 G visited[v] = TRUE; Push(S,v); for(w=FirstAdjVex(G, v);w>=0; w=NextAdjVex(G,v,w)){ {if (w in S) then return(FALSE);//有回边 if(!visited[w]){ if(!DFS-DAG(G, w)) return(FALSE); } Pop(S, v);//v的所有邻接点已经遍历完 return(TRUE); } // DFS-T
由此所得顶点的线性序列称之为拓扑有序序 列
拓扑排序
拓扑排序的用途:判断AOV网是否存在环路 AOV网(Activity On Vertex NetWork) 用顶点表示活动,弧表示活动间的优先关系的 有向图。 AOV网中不应该出现有向环:如果存在环,则某 项活动以自己为先决条件,
拓扑排序
B A C
关键路径
•路径最长的路径叫做关键路径 路径最长的路径叫做关键路径 •影响工程进度的活动叫关键活动 影响工程进度的活动叫关键活动 •关键路径上的活动一定是关键活动 关键路径上的活动一定是关键活动
如何求关键路径
•用e(i)和l(i)分别表示活动ai的最早开始时 用 和 分别表示活动 分别表示活动a 间和最迟开始时间 •e(i)-l(i)为活动 i 的时间余量 为活动a 为活动 •e(i)=l(i)的活动是关键活动 的活动是关键活动
拓扑排序---方法2 拓扑排序 方法2
void DFS-ToplogicalSort (Graph G, int v) {//如何确定 如何确定v 如何确定 for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; // 访问标志数组初始化 InitStack(S);//存放顶点,按照出DFS的次序 for (v=0; v<G.vexnum; ++v) { if (!visited[v]) DFS-T(G, v); // 对尚未访问的顶点调用DFS } while(!Empty(S)){//输出拓扑排序的结果 Pop(S, v); printf(“%d”, v)} }
a6=2
v6
7, 10
a1 6 0 0
a2 4 0 2
a3 5 0 3
a4 1 6 6
a5 1 4 6
a6 2 5 8
a7 8 7 8
a8 7 7 7
a9 a10 a11 4 7 2 4 15 14
e l
10 16 14
如何求关键路径
最终求得的关键路径如下所示: 最终求得的关键路径如下所示: 键路径如下所示
// 对v的尚未访问的邻接顶点w递归调用DFS-T
Push(S, v);//顶点v的DFS函数执行完毕 } // DFS-T
拓扑排序---练习
写出下图的所有的拓扑序列
c a g b h f d e
关键路径
AOE-网(Activity on Edge):边表示活动网。 网 边表示活动网。 边表示活动网
………………
}
拓扑排序---算法 拓扑排序
算法分析: 算法分析: 总的时间复杂度: 总的时间复杂度:O(n+e)
拓扑排序---方法2 拓扑排序 方法2
c a g b h 拓扑序列:b 拓扑序列: f d e
h a cdg f e
拓扑排序---方法2 拓扑排序 方法2
对有向无环图利用深度优先搜索进行拓扑排序。 对有向无环图利用深度优先搜索进行拓扑排序。 深度优先搜索进行拓扑排序
V1到Vj的最长路径
如何求关键路径
V2 v1 V3 v5 v7 v9
v8
vl(n-1)=ve(n-1),然后按照顶点逆拓扑排 ,然后按照顶点逆拓扑排 按照顶点 后的次序求其余顶点的vl 序后的次序求其余顶点的 vl(i)=min(vl(j) - dut(<i,j>)) <i,j>∈S,S是以i为尾的弧的集合 是以i ∈ 是以
c a g b f h 退出DFS函数顺序: 函数顺序: 退出 函数顺序 e d e
f g d c ahb 此图的一个拓扑序列为: 此图的一个拓扑序列为: h a c d g f e b
拓扑排序---方法2 拓扑排序 方法2
结论: 结论:
最先退出DFS函数的顶点是出度为零的顶点,为拓 函数的顶点是出度为零的顶点, 最先退出 函数的顶点是出度为零的顶点 扑排序序列中最后一个顶点。 扑排序序列中最后一个顶点。 因此,按退出DFS函数的先后记录下来的顶点序列 因此,按退出 函数的先后记录下来的顶点序列 即为逆向的拓扑排序序列。 即为逆向的拓扑排序序列。
如何求关键路径
分别表示活动a 用e(i)和l(i)分别表示活动ai的最早开始间 和 分别表示活动 和最迟开始时间 显然有: 显然有: e(i)=ve(j)
j
ai
k
l(i)=vl(k)-dut(j,k)
如何求关键路径
V2 v1 V3 v5 v7 v9
v8
拓扑有序序列: v1 v2 v3 v4 v6 v5 v8 v7 v9 拓扑有序序列 逆拓扑有序序列:v 逆拓扑有序序列 9 v7 v8 v5 v2 v3 v6 v4 v1 v7 v8 v1 v2 v3 v4 v5 v6 ve vl 0
有向无环图及其应用
有向无环图 有向无环图的应用 公用表达式 AOV网-拓扑排序 AOE网-关键路径 小结和作业
有向无环图
一、定义: 定义: 一个无环的有向图,称为有向无环图(DAG图 一个无环的有向图,称为有向无环图(DAG图) DAG = Directed Acyclic Graph
V1 V2 V4 V8 V5 V6 V3 V7 V2 V4 V8 V5 V6 V1 V3 V7
…………
}//while if (count<G.vexnum) return ERROR; else return OK; }
拓扑排序---算法 拓扑排序
Status ToplogicalSort(ALGragh G){
………………
while (!EmptyStack(S)) { Pop(S, v); ++count; printf(v); for (w=FirstAdj(v); w; w=NextAdj(G,v,w)){ --indegree(w); // 弧头顶点的入度减 弧头顶点的入度减1 if (!indegree[w]) Push(S, w); }//for }//while
Status ToplogicalSort(ALGragh G){ FindInDegree(G, indegree); InitStack(S); for(i=0;i<G.vexnum;i++){if(!indegree[i]) push(S,i);} count=0; //对输出顶点计数 对输出顶点计数 while (!EmptyStack(S)) {
V2 v1 v5 V3 v8 v4
a6=2
v7 v9
源点
汇点
v6
事件
活动及其持续的时间
关键路径
AOE-网是一个带权的有向无环图,可用来估算 网是一个带权的有向无环图, 网是一个带权的有向无环图 工程的完成时间。 工程的完成时间。 假设以AOE网表示一个施工流图, AOE网表示一个施工流图 假设以AOE网表示一个施工流图,弧上的权值表示 完成该项子工程所需的时间。 完成该项子工程所需的时间。 1、完成整个工程至少需要多少时间? 完成整个工程至少需要多少时间? 2、哪些活动是影响工程进度的关键? 哪些活动是影响工程进度的关键?
相关文档
最新文档