数据结构,拓扑排序和关键路径.pptVIP

  • 19
  • 0
  • 约8.39千字
  • 约 39页
  • 2016-08-01 发布于湖北
  • 举报
数据结构,拓扑排序和关键路径

问题背景 计划、施工过程、生产流程、程序流程等都可以看作一个任务或“工程”。 除了很小的工程外,一般都把工程分为若干个叫做“活动”的子任务。 活动之间一般会有先后关系。如果不违反限制完成这些活动,那么整个工程顺利完成。 例:选课 计算机专业学生的学习就是一个工程,每一门课程的学习就是整个工程的一项活动。其中有些课程要求先修课程,有些则不要求。这样在有的课程之间有先后关系,有的课程可以并行地学习。 任务:安排一种学习次序,使得所有课程都学习完成,并满足课程的限制关系。 在有向图中,用顶点表示活动,用有向边表示活动之间的先后关系,称这样的有向图为AOV网(Activity On Vertex Network)。 拓扑序列:把AOV网中的所有顶点排成一个线性序列,该序列满足如下条件:如果存在有向边Vi , Vj,则在该序列中,Vi 必位于Vj 之前。 拓扑排序:构造AOV网的拓扑序列的过程被称为拓扑排序。 一种可能的拓扑序列是:C0 , C1 , C2 , C4 , C3 , C5 , C7 , C8 , C6 拓扑序列的存在性 任意AOV网中拓扑序列不一定存在。例如,存在回路的AOV网就无法找到拓扑序列。因为出现了有向环,则意味着某项活动应以自己作为先决条件。 有向无环图一定存在拓扑序列。 构造方法 引理5.1: 设图G = (V, E)是有向无环图, V(G)≠Φ, 则G中一定存在入度为零的顶点。 构造方法: ①? 从网中选择一个入度为0的顶点且输出之。 ②? 从网中删除该顶点及其所有出边。 ③?执行① ② ,直至所有顶点已输出,或网中剩余顶点入度均不为0 (说明网中存在回路)。 C0 , C1 , C2 , C4 , C3 , C5 , C7 , C8 , C6 C0 , C1 , C4 , C2 , C3 , C5 , C7 , C8 , C6 C0 , C1 , C7 , C2 , C4 , C3 , C5 , C8 , C6 算法设计 AOV网用邻接表的形式存储; 数组count[ ],count[i]的值是顶点i的入度; 使用一个数据结构,存放入度为0的点。 线性表 存放时发生在一端;取用顺序无所谓,在同一端(栈)或另一端(队列)。 栈的模拟 利用变量top和count数组元素的值来模拟堆栈的压入和弹出。 原理:利用入度为0的count[i]空间记录栈元素的下标;top始终记录栈顶元素的下标。 拓扑排序算法 算法TopoOrder( ) /* 图的拓扑排序算法,n表示顶点数 */ T1[初始化] for( i = 1 ; i= n ; i ++ ) count[i] = 0; for( i = 1 ; i= n ; i ++ ) for( p = Head[i].adjacent ; p ; p = p-link ) count[ p-VerAdj ] ++; for( i = 1 ; i= n ; i ++ ) if( count[i] == 0 ) count[i] = top , top = i ; T2[拓扑排序] for( i = 1 ; i = n ; i++ ){ if ( top == - 1 ) { cout“有回路! ”; RETURN; } j = top , top = count[top] . /* 弹出栈顶j */ cout j ; //按要求处理 顶点 j for ( p= Head[j] . adjacent ; p ; p = p - link) { k = p - VerAdj ; count[k] -- ;// 顶点k的入度减1 if (count[k] == 0 ) count[k]=top, top = k; } } ? 模拟栈的状态 初始化: top = -1; 栈 空: top == -1 入栈:count[i] = top; top = i; 出栈:j = top; top = count[top]; 算法分析 定理5.2 设G=(V, E)是有向无环图,V(G)={1, 2 ,…, n}, e=|E(G)|. 则算法TopoOrder是正确的且算法的时间复杂性为 O(n+e). 正确性证明: 初始化T1时,栈不为空 T2时,如果G不空,栈也不空。输出n个顶点结束 设v,w是边,则 v 一定 排在 w 之前。 拓展

文档评论(0)

1亿VIP精品文档

相关文档