有向图是描述工程进行过程的有效工具,几乎全部的工程均可以分为若干个“活动”的子工程,每一个活动都会持续一段时间,某些活动之间每每存在必定的约束关系,好比某些活动的开始必须在某些特定活动的结束才能够运行。
下面对于有向图咱们进行拓扑排序和关键路径的讨论。web
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称AOV网(activity on vertex network),显然,AOV网中不能出现回路,不然意味着某项活动的开始要以本身的完成做为先决条件,这显然是不成立的。所以判断AOV网可否正常进行即判断它是否存在回路。测试AOV网是否存在回路的方法就是对AOV网进行拓扑排序。svg
拓扑序列:设G=(V,E)是一个有向图,V的顶点序列v0,v1,…vn-1称为一个拓扑序列当且仅当知足如下条件:若从顶点vi到vj有一条路径,则在顶点序列中vi必须存在于vj以前。
对一个有向图构造拓扑序列的过程称为拓扑排序。(不惟一)
过程:工具
for{ 找出入度为0(没有前驱)的顶点输出; 删除(模拟删除)该点和该点引出的边; }
在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,称这样的有向图为边表示活动的网,简称AOE网(activity on edge network),AOE网中没有入边的顶点称为源点,没有出边的顶点称为终点。测试
1.只有在进入某顶点的各活动都已经结束,该顶点所表明的事件才能开始发生。
2.只有某顶点所表明的事件发生后,从该顶点出发的各个活动才能开始。
由AOE网的性质知:完成整个工程所需的时间应该为始点到终点的最大路径长度(这里的最大路径长度是指该路径上的各个活动所持续的时间之和)。具备最大路径长度的路径称为关键路径(critical path),关键路径上的活动称为关键活动(critical activity),关键路径长度是整个工程所需的最短工期,也就是说,要想缩短整个工期,必须加快关键活动的进度。spa
(ve[k]是指从源点到顶点vk的最大路径长度,这个长度决定了全部从顶点vk发出的活动能够开始的最先时间)
ve[0]=0;
ve[k]=max{ve[j]+length<vj,vk>}(<vi,vj>属于p[k])(p[k]表示全部到达vk的有向边的集合,len<vj,vk>为有向边<vi,vj>的权值)code
(vl[k]是指在不推迟整个工期的前提下,时间vk容许的最晚发生时间)
vl[n-1]=ve[n-1]
vl[k]=min{vl[j]-len<vk,vj>}xml
(活动ai的最先开始时间应等于事件vk的最先发生时间。)
ee[i]=ve[k]排序
(e[i]是指在不推迟整个工期的前提下么活动ai必须开始的最晚时间。)
el[i]=vl[j]-len<vi,vj>token
根据每一个活动的最先开始时间ee[i]和最晚开始时间el[i]断定活动是否为关键活动:当ee[i]=el[i]的活动就是关键活动,那些el[i]>ee[i]的活动则不是关键活动,el[i]-ee[i]的值为活动的时间余量,关键活动肯定以后,关键活动所在的路径就是关键路径。事件
AOV{ 顶点->活动; 弧/边->活动间优先关系; } AOE{ 顶点->事件; 弧/边->活动,边上的权值表示活动的持续时间; }