算法与数据结构-有向无环图及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图与网的定义和术语
* + * + 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
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)
图与网的定义和术语
if (ve[j] + * (p->info) > ve[k]) ve[k] = ve[j] + *( p->info); } // for * (p->info) = dut (<j, k>) } // while ห้องสมุดไป่ตู้f (count < G.vexnum) return ERROR; //该有向网有回路 } // TopologicalOrder
图与网的定义和术语
(5)关键路径算法 ①算法思想: 1.输入e条弧<j, k>,建立AOE-网的存储结构; 2.从源点v0出发,令ve[0] = 0,按拓扑有序求其余各顶点的最早发 生时间ve[i](1≤i≤n-1)。如果得到的拓扑有序序列中顶点个数小于网中 顶点数n,则说明网中存在环,不能求关键路径,算法终止;否则执行步 骤3。 3.从汇点vn出发令vl[n-1] = ve[n-1],按逆拓扑有序求其余各顶 点的最迟发生时间veli]( 2≤i≤n-2); 4.根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开 始时间l(s)。若某条弧满足条件e(s) = l(s),则为关键活动。 ②算法实现 如①所述,计算各顶点的ve值是在拓扑排序的过程中进行的,需对 拓扑排序的算法作如下修改: 1.在拓扑排序之前设初值,令ve[i]=0(0≤i≤n-1); 2.在算法中增加一个计算vj的之间后继vk的最早发生时间的操作: 若ve(j) + dut(<j, k>) > ve[k],则ve[k]=ve(j) + dut(<j, k>); 3.为了能按逆拓扑有序序列的顺序计算各顶点的vl值,需记下在拓 扑排序的过程中求得的拓扑有序序列,这需要在拓扑排序算法中,增设 一个栈以记录拓扑有序序列,则在计算求得各顶点的ve值之后,从栈顶至 栈底便为逆拓扑有序序列。
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
时间复杂度: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都没有前驱。依次类推,可从中任选一个继续进 行。最后得到该有向图的拓扑有序序列为:
例如,通常,AOE-网可用来估算工程的完成时间。图7.21是一个假想的 有11项活动的AOE-网。其中有9个事件v1, v2, v3, … , v9,每个事件表示在它 之前的活动已经完成,在它之后的活动可以开始。与每个活动相联系的数是 执行该活动所需的时间。 V2 a4=1 a2=4 V3 a3=5 V4 a6=2 V6 V7
图与网的定义和术语
算法7.11如下 (由算法7.10改写而成) : Status TopologicalOrder (ALGraph G, Stack &T) { //有向网G采用邻接表存储结构,求各顶点事件最早发生时间ve // (全局变量)。 T为拓扑序列顶点栈,S为零入度顶点栈。 //若G无回路,则用栈T返回G的一个拓扑序列,且函数值为OK, //否则ERROR。 FindInDegree (G, indegree); //对各顶点求入度indegree[0..vernum-1] 建0入度顶点栈S; InitStack (T); //初始化 count = 0; ve[0..G.vexnum-1] = 0; while (!StackEmpty (S)) { Pop (S, j); Push (T, j); //j号顶点入T栈并计数 + + count; for (p = G.vertices[i].firstarc; p; p = p->nextarc) { k = p->adjvex; //对j号顶点的每个邻接点的入度减1 if ((――indegree[k]) = = 0) Push (S, k); //若入度减为0,则入栈
v6 v1 v4 v3 v2 v5
图与网的定义和术语
£7.5.3 关键路径
(1)定义 关键路径(Critical Path):在AOE-网中有些活动可以并行的进行, 所以完成工程的最短时间是从开始点到完成点的最长路径的长度(路径 长度是指路径上各活动持续时间之和,而不是路径上弧的数目)。这个 路径长度最长的路径叫关键路径。 关键活动:l(i) = e(i)的活动。即活动的最早开始时间=最迟开始时间。 显然,关键路径上的所有活动都是关键活动。 (2)AOE-网 AOE-网(Activity On Edge):即边表示活动的网。AOE-网是一个 带权的有向无环图。其中,顶点表示事件(Event),弧表示活动,权 表示活动持续的时间。
a1=6
a7=9
a10=2
V1
V5
a5=1 a8=7 V8 a9=4
V9
a11=4
图7.21 一个AOE-网 其中,v1为源点(入度为零的点);v9为汇点(出度为零的点)。
图与网的定义和术语
(3)事件的最早发生时间ve(j)和最迟发生时间vl(j) ①从ve(0) = 0开始向前递推 ve(j) = Max{ve(i) + dut(<i, j>)} <i, j>∈T, j = 1, 2, … , n-1 其中,T是所有以第j个顶点为头的弧的集合。dut(<i, j>)是由<j , k>弧 表示的活动的持续时间。 ②从vl(n-1) = ve(n-1)起向后递推 vl(i) = Min{vl(j)-dut(<i, j>)} <i, j>∈S, i = n-2, … , 0 其中,S是所有以第i个顶点为尾的弧的集合。 (4)活动的最早发生时间和最迟发生时间 最早开始时间:假设开始点是v1,从v1到vi的最长路径长度叫做事件vi 的最早发生时间。这个时间决定了所有以vi为尾的弧所表示的活动的最早 开始时间。记为e(i),表示活动ai的最早开始时间。 最迟开始时间:在不推迟整个工程完成的前提下,活动ai最迟必须开始 进行的时间。记为l(i),表示活动ai的最迟开始时间。 如果活动ai由弧<j , k>表示,其持续时间记为dut(<j, k>),则 e(i) = ve(j) l(i) = vl(k) -dut(<j, k>)
全序关系:R是集合X上的偏序,若对每个x, y∈X必有xRy或yRx, 则称R是集合X上的全序关系。
(2)AOV-网 AOV-网:用顶点表示活动,用弧表示活动间的优先关系的有向图 称为顶点表示活动的网(Activity On Vertex Network),简称AOV-网。 在网中,若从顶点i到顶点j有一条有向路径,则i是j的前驱; j是i的后继。若<i, j>是网中的一条弧,则i是j的直接前驱; j是i的直接后继。
图与网的定义和术语
(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者进栈
图与网的定义和术语
例如,一个软件专业的学生必须学习一系列基本课程(如图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