有向无环图及其应用

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

C4
C2 C1 C3
C5
C7
C12
C8 C9 C10 C6
C11
图7.19 表示课程之间优先关系的有向图 图7.19中,顶点表示课程,有向边(弧)表示先决条件。若课程i是 课程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)
全序关系:R是集合X上的偏序,若对每个x, y∈X必有xΒιβλιοθήκη Baiduy或yRx, 则称R是集合X上的全序关系。
(2)AOV-网 AOV-网:用顶点表示活动,用弧表示活动间的优先关系的有向图 称为顶点表示活动的网(Activity On Vertex Network),简称AOV-网。 在网中,若从顶点i到顶点j有一条有向路径,则i是j的前驱; j是i的后继。若<i, j>是网中的一条弧,则i是j的直接前驱; j是i的直接后继。
例如,一个软件专业的学生必须学习一系列基本课程(如图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
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图和有向图的例子。
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
(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者进栈
时间复杂度:O(n + e)。
③例子 以图7.20(a)中的有向图为例。 V1 V4 V6 V2 V3 V5 V1 V4 V2 V3 V5 V4 V2 V3 V5 V2 V3 V5 (d) V5 (e) V2
V5
(f)
(a)
(b)
(c)
图7.20 AOV-网及其拓扑有序序列产生的过程 (a) AOV-网; (b) 输出v6之后; (c) 输出v1之后; (d) 输出v4之后; (e) 输出v3之后; (f) 输出v2之后; 说明:图中v1和v6没有前驱,则可任选一个。假设先输出v6,在输出v6及弧 < v6, v4>,< v6, v5>之后,只有顶点v1没有前驱,则输出v1且删去v1及弧< v1, v2>, < v1, v3>和< v1, v4>,之后v3和v4都没有前驱。依次类推,可从中任选一个继续进 行。最后得到该有向图的拓扑有序序列为:
* + * + a 图7.17 b * c + d * e
描述表达式的有向无环图
表达式((a +b ) * (b * (c + d)) + (c + d) * e) * ((c + d) * e)
£7.5.2 拓扑排序
(1)定义 拓扑排序(Topological Sort):简单地说,由某个集合上的一个 偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 偏序关系:若集合X上的关系R是自反的、反对称的和传递的,则 称R是集合X上的偏序关系。
图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
相关文档
最新文档