有向无环图的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的弧; 3)重复上述两步,直至图空,或者图不空但
找不到无前驱的顶点为止。后一种情况说明有向 图中存在环。
如何在计算机中实现 拓扑排序呢?
拓扑排序算法的实现
为了实现拓扑排序的算法,对给定的有向图可采用邻 接表作为它的存储结构。
将每个链表的表头结点构成一个顺序表,各表头结点 的Data域存放相应顶点的入度值。每个顶点入度初值 可随邻接表动态生成过程中累计得到。
在拓扑排序过程中,凡入度为零的顶点即是没有前趋 的顶点,可将其取出列入有序序列中,同时将该顶点 从图中删除掉不再考虑。
删去一个顶点时,所有它的直接后继顶点入度均减1, 表示相应的有向边也被删除掉。
设置一个堆栈,将已检验到的入度为零的顶点标号进 栈,当再出现新的无前趋顶点时,也陆续将其进栈。 每次选入度为零的顶点时,只要取栈顶顶点即可。
C8
C1 C3
C9 C7
C4 C6
C2
C5
课程开设优先关系的有向图
课程开拓设扑工有程图序序列:
(C1,C2,C3,C4,C5,C8,C9,C7,C6)
(C2,C5,C1,C8,C3,C9,C4,C7,C6)
如何进行拓扑排序?
解决方法: 1)从有向图中选取一个没有前驱的顶点,并
输出之; 2)从有向图中删去此顶点以及所有以它为尾
何谓“拓扑排序” ?
拓扑序列: 在AOV网中,若不存在回路,则所有活动可排列 成一个线性序列,使得每个活动的所有前驱活 动都排在该活动的前面,我们把此序列叫做拓 扑序列。
拓扑排序 由AOV网构造拓扑序列的过程叫拓扑排序。AOV 网的拓扑序列不是唯一的,满足上述定义的任 一线性序列都称为它的拓扑序列。
InitStack(S); for(i=0;i<G.vexnum; ++i)//建零入度顶点栈
if(!indegree[i])Push(S,i) //入度为0者进栈 count=0; //对输出顶点计数
while (!StackEmpty(S)) { Pop(S,i); printf(i,G.vertices[i].data); ++count;
AOV网络的邻接表



02
4∧
11
0∧


20
0
4∧
30
1
4∧
4 3∧
数组下标
顶点的入度
用邻接表存储AOV网络,拓扑排序算法描述:
(1) 把邻接表中所有入度为零的顶点进栈; (2) 在栈不空时:
① 退栈并输出栈顶的顶点 j; ② 在邻接表的第 j 个单链表中,查找顶点 为 j 的所有直接后继顶点 k,并将 k 的入度减1。 若顶点 k 的入度为零,则顶点 k 进栈; ③ 若栈空时输出的顶点个数不是 n,则有向 图中有环路,否则拓扑排序完毕。
}//TopologicalSort
分析: 对有 n 个顶点和 e 条弧的有向图而言,建
立求各顶点的入度的时间复杂度为O(e);建零入 度顶点栈的时间复杂度为O(n);在拓扑排序过程 中,若有向图无环,则每个顶点进一次栈,出一 次栈,入度减1的操作在 WHILE语句中总共执行e 次,所以,总的时间复杂度为O(n+e)。

对整个工程和系统,人们关心的是两个方面 的问题:一是工程能否顺利进行;二是估算整个 工程完成所必须的最短时间。
有向无环图的应用: 拓扑排序 关键路径
在工程实践中,一个工程项目往往由若干个 子项目组成,这些子项目间往往有多种关系:
①先后关系,即必须在一子项目完成后,才 能开始实施另一个子项目;
拓扑排序的算法是下一讲讨论的求关键路径的 基础。
课程名称 程序设计基础
离散数学 数据结构 汇编语言 算法分析与设计 计算机组成原理 编译原理 操作系统 高等数学 线性代数 普通物理 数值分析
ቤተ መጻሕፍቲ ባይዱ
先导课程编号 无 C1
C1,C2 C1
C3,C4 C11
C5,C3 C3,C6
无 C9 C9 C9,C10,C1
课程先后关系如图:
c4
c5
c2
c7
c1 c3
第7章 图
7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径
7.5 有向无环图及其应用
有向无环图(directed acycline graph)简 称DAG图,是描述一项工程或系统的进行过程的 有效工具。





c1122
c9
c10
cc121
c8 c6
在AOV网络中,如果顶点Vi的活动必须在顶点Vj的活动以 前进行,则称Vi为Vj的前趋顶点,而称Vj为Vi的后继顶点。 这种前趋后继关系有传递性。此外,任何活动i不能以它 自己作为自己的前驱或后继,这叫做反自反性。 从前驱和后继的传递性和反自反性来看,AOV网中不能 出现回路(有向环),回路表示顶点之间的先后关系进入了 死循环。 判断AOV网是否有有向环的方法是对该AOV网进行拓扑排 序,将AOV网中顶点排列成一个线性有序序列,若该线性 序列中包含AOV网全部顶点,则AOV网无环,否则,AOV网 中存在有向环,该AOV网所代表的工程是不可行的。
拓扑排序算法
Status Topological Sort(ALGraph G){ //有向图G采用邻接表存储结构。若G无回路, //则输出G的顶点的1个拓扑序列并返回OK,否则ERROR
FindInDegree(G,indegree); //对各顶点求入度indegree[0..vernum-1]
②子项目之间无次序要求,即两个子项目可 以同时进行,互不影响。
7.5.1 拓扑排序
我们用一种有向图来表示上述问题。在 这种有向图中,顶点表示活动,有向边表示 活动的优先关系,这种有向图叫做顶点表示 活动的网络(Activity On Vertex Network) 简称为AOV网。
课程编号 C1 C2 C3 C4 C5 C6 C7 C8 C9 C 10 C11 C12
//输出i号顶点并计数 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;//该有向图有回路 else return OK;
相关文档
最新文档