您的位置:首页 > 其它

拓扑排序--关键路径

2015-04-12 20:10 246 查看
拓扑排序和关键路径是基于无环的有向图。

主要用来表示工程进度中各个事件之间的关系。

拓扑排序和关键路径 使用邻接表存储数据,最小生成树和最短路径用 邻接矩阵 存储数据。

1、拓扑排序

AOV网:在一个表示工程的有向图中,用固定点表示活动,用弧表示活动之间的优先级关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity On Vertex Network)

拓扑排序:是将一个AOV网的各个顶点按一定顺序排列,要求满足若存在<Vi,Vj>,则排序中的顶点Vi必在顶点Vj之前。对于同一幅图,拓扑排序可有多个拓扑排序。

在显示生活中,用到的拓扑排序的例子:

学校课程布置图,要先修完一些基础课,才可以继续修专业课,以计算机软件专业为例,在《程序设计基础》和《离散数学》课程学完之前就不能开始学习《数据结构》,这些先决条件定义了课程之间的优先(领先)关系。

算法:

(1)从有向图中选择一个无前驱(入度为0)的顶点输出。

(2)删除此顶点,并删除已此顶点为为尾的弧。

(3)重复(1),(2)步骤,知道输出全部顶点或者AOV网中不存在入度为0的顶点。

具体实现代码:

用栈来保存入度为0的顶点,和更新后入度为0的顶点

分析整个算法,对一个具有n个顶点e条弧的AOV网来说,将入度为0的顶点入栈的时间复杂度为O(n),而之后的while循环中,每个顶点入一次栈,出一次栈,入度减1的操作执行了e次,所以整个算法时间复杂度为O(n+e)。

2、关键路径

拓扑排序是解决一个工程能否顺序进行的问题,但有时还需解决工程完成需要的最短时间。

AOE网:在一个表示工程带权的有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种用有向图的边表示活动的网,我们称之为AOE网(Activity On Edge Network)













用ve(i)表示事件(即顶点)i的最早开始时间,用vl(i)表示事件i的最开始时间,如果活动k由弧<m,n>表示,用dut(<m,n>)表示活动的持续时间,则有:

e(k) = ve(m)

l(k) = vl(n) - dut(<m,n>)

求解关键路径的具体算法(假设图中有n个顶点)

(1) 从开始顶点V0出发,假设ve(0)=0,然后按照拓扑有序求出其他各顶点i的最早开始时间ve(i),如果得到拓扑序列中顶点数目小于图中的顶点数,则表示图中存在回路,算法结束,否则继续执行。

(2)从结束顶点Vn出发,假设vl(n-1) = ve(n-1);然后求出各顶点i的最晚发生时间。

(3)根据顶点的最早发生时间,和最晚发生时间,依次求出出每条弧的最早开始时间和最晚开始时间,如果两只相等,则为关键活动。关键活动组成的路径则为关键路径。

具体实现代码:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: