有向无环图及其应用

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

有向树, 图7.15 有向树,DAG图和有向图一例 图和有向图一例
(2)表达式子式共享 ) 例如,下述表达式 例如,下述表达式((a +b ) * (b * (c + d)) + (c + d) * e) * ((c + d) * e),用 , 二叉树表示如图7.16所示,用有向无环图表示如图7.17所示. 所示, 所示. 二叉树表示如图 所示 用有向无环图表示如图 所示 * + * + a b b c * + d 图7.16 用二叉树描述表达式 c + d * e c + d * e
count = 0; while (!StackEmpty (S)) { Pop (S, i); printf (i, G.vertices[i].data); //输出 号顶点并计数 输出i号顶点并计数 输出 ++ count; for (p = G.vertices[i].firstarc; p; p = p->nextarc) { - k = p->adjvex; //对i号顶点的每个邻接点的入度减 号顶点的每个邻接点的入度减1 - 对 号顶点的每个邻接点的入度减 if (!(――indegree[k])) Push (S, k); //若入度减为 ,则入栈 若入度减为0, 若入度减为 } // for } // while if (count < G.vexnum) return ERROR; //该有向图有回路 该有向图有回路 } // TopologicalSort
v6 → v1 → v 4 → v3 → v 2 → v5
£7.5.3 关键路径
(1)定义 ) 关键路径( ):在 网中有些活动可以并行的进行, 关键路径(Critical Path):在AOE-网中有些活动可以并行的进行, ): 网中有些活动可以并行的进行 所以完成工程的最短时间是从开始点到完成点的最长路径的长度( 所以完成工程的最短时间是从开始点到完成点的最长路径的长度(路径 长度是指路径上各活动持续时间之和,而不是路径上弧的数目). ).这个 长度是指路径上各活动持续时间之和,而不是路径上弧的数目).这个 路径长度最长的路径叫关键路径. 路径长度最长的路径叫关键路径. 关键活动: 的活动. 关键活动:l(i) = e(i)的活动.即活动的最早开始时间=最迟开始时间. 的活动 即活动的最早开始时间=最迟开始时间. 显然,关键路径上的所有活动都是关键活动. 显然,关键路径上的所有活动都是关键活动. (2)AOE-网 ) 网 AOE-网(Activity On Edge):即边表示活动的网.AOE-网是一个 网 ):即边表示活动的网 ):即边表示活动的网. 网是一个 带权的有向无环图.其中,顶点表示事件(Event),弧表示活动,权 带权的有向无环图.其中,顶点表示事件( ),弧表示活动, ),弧表示活动 表示活动持续的时间. 表示活动持续的时间.
7.1图的定义和术语 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径
£7.5 有向无环图及其应用
£7.5.1 有向无环图
有向无环图( ):无环的有向图 有向无环图(directed acycline graph):无环的有向图,简称 ):无环的有向图,简称DAG 图是一类较有向树更一般的特殊有向图. 图.DAG图是一类较有向树更一般的特殊有向图. 图是一类较有向树更一般的特殊有向图 例如, 示例了有向树, 图和有向图的例子. 例如,图7.15示例了有向树,DAG图和有向图的例子. 示例了有向树 图和有向图的例子
C4 C2 C1 C12 C3
C5 C7
C8 C9 C10 C11 C6
图7.19 表示课程之间优先关系的有向图 表示先决条件.若课程i是 图7.19中,顶点表示课程,有向边(弧)表示先决条件.若课程 是 中 顶点表示课程,有向边( 课程j的先决条件 则图中有弧<i, . 的先决条件, 课程 的先决条件,则图中有弧 j>. 如下,为图 中的有向图的拓扑有序序列的其中两个序列: 如下,为图7.19中的有向图的拓扑有序序列的其中两个序列: 中的有向图的拓扑有序序列的其中两个序列 1.(C1, C2, C3, C4, C5, C7, C9, C10, C11, C6, C12, C8) . 2.(C9, C10, C11, C6, C1, C12, C4, C2, C3, C5, C7, C8) .
* + * + a 图7.17 b * c + d * e
描述表达式的有向无环图
表达式((a 表达式 +b ) * (b * (c + d)) + (c + d) * e) * ((c + d) * e)
£7.5.2 拓扑排序
(1)定义 ) 拓扑排序( ):简单地说 拓扑排序(Topological Sort):简单地说,由某个集合上的一个 ):简单地说, 偏序得到该集合上的一个全序,这个操作称之为拓扑排序. 偏序得到该集合上的一个全序,这个操作称之为拓扑排序. 偏序关系:若集合 上的关系 是自反的,反对称的和传递的, 上的关系R是自反的 偏序关系:若集合X上的关系 是自反的,反对称的和传递的,则 称R是集合 上的偏序关系. 是集合X上的偏序关系. 是集合 上的偏序关系 全序关系: 是集合 上的偏序,若对每个x, ∈ 必有 是集合X上的偏序 必有xRy或yRx, 全序关系:R是集合 上的偏序,若对每个 y∈X必有 或 , 则称R是集合 上的全序关系. 是集合X上的全序关系 则称 是集合 上的全序关系. (2)AOV-网 ) 网 AOV-网:用顶点表示活动,用弧表示活动间的优先关系的有向图 网 用顶点表示活动, 称为顶点表示活动的网( ),简称 称为顶点表示活动的网(Activity On Vertex Network),简称 ),简称AOV-网. 网 在网中,若从顶点 到顶点 有一条有向路径, 是 的前驱 到顶点j有一条有向路径 的前驱; 在网中,若从顶点i到顶点 有一条有向路径,则i是j的前驱; j是i的后继.若<i, j>是网中的一条弧,则i是j的直接前驱; 的后继. 是网中的一条弧, 是 的直接前驱 的直接前驱; 是 的后继 是网中的一条弧 j是i的直接后继. 的直接后继. 是 的直接后继
时间复杂度: 时间复杂度:O(n + e). .
③例子 以图7.20(a)中的有向图为例. 中的有向图为例. 以图 中的有向图为例 V1 V4 V6 (a) V2 V3 V5 (b) V1 V4 V2 V3 V5 (c) V4 V2 V3 V5 V2 V3 V5 (d) V5 (e) V5 (f) V2
图7.20 AOV-网及其拓扑有序序列产生的过程 网及其拓扑有序序列产生的过程 (a) AOV-网; (b) 输出 6之后; (c) 输出 1之后; 输出v 之后; 输出v 之后; 网 (d) 输出 4之后; (e) 输出 3之后; (f) 输出 2之后; 输出v 之后; 输出v 之后; 输出v 之后; 说明:图中v 没有前驱,则可任选一个.假设先输出v 在输出v 说明:图中 1和v6没有前驱,则可任选一个.假设先输出 6,在输出 6及弧 < v6, v4>,< v6, v5>之后,只有顶点 1没有前驱,则输出 1且删去 1及弧 v1, v2>, 之后, 之后 只有顶点v 没有前驱,则输出v 且删去v 及弧< < v1, v3>和< v1, v4>,之后v3和v4都没有前驱.依次类推,可从中任选一个继续进 和 ,之后 都没有前驱.依次类推, 最后得到该有向图的拓扑有序序列为: 行.最后得到该有向图的拓扑有序序列为:
例如,一个软件专业的学生必须学习一系列基本课程 如图 如图7.18所示 , 所示), 例如,一个软件专业的学生必须学习一系列基本课程(如图 所示 其中有些课程是基础课,它独力于其他课程, 高等数学》 其中有些课程是基础课,它独力于其他课程,如《高等数学》;而另一些 课程必须在学完作为它的基础的先修课程才能开始. 课程必须在学完作为它的基础的先修课程才能开始.如,在《程序设计基 离散数学》学完之前就不能开始学习《数据结构》 础》和《离散数学》学完之前就不能开始学习《数据结构》.这些先决条 件定义了课程之间的领先(优先)关系.这个关系可以用有向图 有向图7.19清楚 件定义了课程之间的领先(优先)关系.这个关系可以用有向图 清楚 的表示. 的表示. 课程编号 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 图7.18 课程名称 程序设计基础 离散数学 数据结构 汇编语言 语言的设计和分析 计算机原理 编译原理 操作系统 高等数学 线性代数 普通物理 数值分析 软件专业的学生必须学习的课程 先决条件 无 C1 C1,C2 C1 C3,C4 C11 C3,C5 C3,C6 无 C9 C9 C9,C10,C1
(3)拓扑排序 ) 算法思想: ①算法思想: 1.在有向图中选一个没有前驱的顶点且输出之. .在有向图中选一个没有前驱的顶点且输出之. 2.从图中删除该顶点和所有以它为尾的弧. .从图中删除该顶点和所有以它为尾的弧. 3.重复上述两步,直至全部顶点均已输出,或者当前图中步存在 .重复上述两步,直至全部顶点均已输出, 无前驱的顶点为止. 无前驱的顶点为止. 算法实现: ②算法实现: 针对上述操作,采用邻接表作有向图的存储结构, 针对上述操作,采用邻接表作有向图的存储结构,且在头结点中 增加一个存放顶点入度的数组( ).入度为 增加一个存放顶点入度的数组(indegree).入度为 的顶点即为没有 ).入度为0的顶点即为没有 前驱的顶点,删除顶点及以它为弧的操作, 前驱的顶点,删除顶点及以它为弧的操作,则可换以弧头顶点的入度 来实现. 减1来实现. 来实现 算法7.10如下: 如下: 算法 如下 Status TopologicalSort (ALGraph G) { //有向图 采用邻接表存储结构. 有向图G采用邻接表存储结构 有向图 采用邻接表存储结构. //若G无回路,则输出 的顶点的一个拓扑序列,并返回 无回路, 的顶点的一个拓扑序列, 若 无回路 则输出G的顶点的一个拓扑序列 并返回OK,否则 ,否则ERROR. . FindInDegree (G, indegree); //对各顶点求入度 对各顶点求入度indegree[0..vernum-1] 对各顶点求入度 - InitStack (S); for (i = 0; i < G.vexnum; ++i) //建0入度顶点栈 入度顶点栈S 建 入度顶点栈 if (!indegree[i]) Push (S, i); //入度为 者进栈 入度为0者进栈 入度为

a1=6 V1
一个AOE-网 图7.21 一个 网 其中, 为源点(入度为零的点); 为汇点(出度为零的点). );v 其中,v1为源点(入度为零的点); 9为汇点(出度为零的点).
和最迟发生时间vl(j) (3)事件的最早发生时间 )事件的最早发生时间ve(j)和最迟发生时间 和最迟发生时间 ①从ve(0) = 0开始向前递推 开始向前递推 ve(j) = Max{ve(i) + dut(<i, j>)} <i, j>∈T, j = 1, 2, … , n-1 ∈ - 其中, 是所有以第 个顶点为头的弧的集合. 是所有以第j个顶点为头的弧的集合 是由<j 其中,T是所有以第 个顶点为头的弧的集合.dut(<i, j>)是由 , k>弧 是由 弧 表示的活动的持续时间. 表示的活动的持续时间. ②从vl(n-1) = ve(n-1)起向后递推 - - 起向后递推 vl(i) = Min{vl(j)-dut(<i, j>)} <i, j>∈S, i = n-2, … , 0 - ∈ - 其中, 是所有以第 个顶点为尾的弧的集合. 是所有以第i个顶点为尾的弧的集合 其中,S是所有以第 个顶点为尾的弧的集合. (4)活动的最早发生时间和最迟发生时间 ) 最早开始时间:假设开始点是 的最长路径长度叫做事件v 最早开始时间:假设开始点是v1,从v1到vi的最长路径长度叫做事件 i 的最早发生时间.这个时间决定了所有以v 的最早发生时间.这个时间决定了所有以 i为尾的弧所表示的活动的最早 开始时间.记为e(i),表示活动ai的最早开始时间. 开始时间.记为 ,表示活动 的最早开始时间. 的最早开始时间 最迟开始时间:在不推迟整个工程完成的前提下,活动 最迟开始时间:在不推迟整个工程完成的前提下,活动ai最迟必须开始 进行的时间.记为l(i),表示活动ai的最迟开始时间 的最迟开始时间. 进行的时间.记为 ,表示活动 的最迟开始时间. 如果活动a 由弧<j 表示, 如果活动 i由弧 , k>表示,其持续时间记为 表示 其持续时间记为dut(<j, k>),则 , e(i) = ve(j) l(i) = vl(k) -dut(<j, k>)
例如,通常, 网可用来估算工程的完成时间. 例如,通常,AOE-网可用来估算工程的完成时间.图7.21是一个假想的 网可用来估算工程的完成时间 是一个假想的 项活动的AOE-网.其中有 个事件 1, v2, v3, … , v9,每个事件表示在它 个事件v 有11项活动的 项活动的 网 其中有9个事件 之前的活动已经完成,在它之后的活动可以开始.与每个活动相联系的数是 之前的活动已经完成,在它之后的活动可以开始. 执行该活动所需的时间. 执行该活动所需的时间. V2 a4=1 a2=4 V3 a3=5 V4 a6=2 V6 V7 a7=9 V5 a5=1 a8=7 V8 a9=4 a10=2 V9 a11=4
相关文档
最新文档