1. 拓扑排序
(1)定义
- AOV网:顶点表示活动,有向边
<
V
i
,
V
j
>
<V_i,V_j>
<Vi?,Vj?>表示活动
V
i
V_i
Vi?先于活动
V
j
V_j
Vj?进行的一种关系。
①AOV网一定是有向无环图。 ②任何顶点不能以自己作为其前驱或后继。 - 拓扑排序:对有向无环图顶点的一种排序。使得若存在一条从顶点A到顶点B的路径,则在排序中顶点B出现在顶点A的后面。
①理解为工程事件执行的先后次序。 ②一个AOV网可能有多种拓扑排序。
(2)思路 初始化时将AOV网中所有入度为0的顶点加入栈中。
- 从栈中选择一个入度为0的顶点并输出。
- 删除该顶点和以它为起点的有向边。
- 循环步骤1、2,直到AOV网为空或当前网中不存在无前缀的顶点。
bool ToplogicalSort(Gragh G) {
for(int i=0; i<G.vexnum; i++)
if(indegree[i] == 0)
S.push(i);
int count = 0;
while(!S.empty()) {
i = S.top(); S.pop();
count++;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{
v = p->adjvex;
if((--indegree[v]) == 0)
S.push(v);
}
}
if(count < G.vexnum)
return false;
else return true;
}
(3)时间复杂度
- 采用邻接表存储图时,时间复杂度为
O
(
∣
V
∣
+
∣
E
∣
)
O(|V|+|E|)
O(∣V∣+∣E∣)。
- 采用邻接矩阵存储图时,时间复杂度为
O
(
∣
V
∣
2
)
O(|V|^2)
O(∣V∣2)。
2. 逆拓扑排序
(1)思路 初始化时将AOV网中所有出度为0的顶点加入栈中。
- 从栈中选择一个出度为0的顶点并输出。
- 删除该顶点和以它为终点的有向边。
- 循环步骤1、2,直到AOV网为空或当前网中不存在无前缀的顶点。
3. 关键路径
(1)定义
-
AOE网:在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销。 ①AOE网中边有权值,AOV网中边无权值。 ②只有在某个顶点代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始。 ③只有在进入某顶点的所有边代表的活动都结束时,该顶点所代表的事件才能发生。 -
开始顶点:仅有的一个入度为0的顶点,称为源点。 -
结束顶点:仅有一个出度为0的顶点,称为汇点。 -
关键路径:从源点到汇点的所有路径中,具有最大路径长度的路径。 ①关键路径表示完成整个工程需要的最短时间 -
关键活动:关键路径上的活动。 -
事件
v
k
v_k
vk?的最早发生时间ve:指从源点到顶点的最长路径长度。 -
活动的最早发生时间e:弧的起点表示的事件的最早发生时间ve。 -
事件的最迟发生时间vl: -
活动的最迟发生时间l:弧的起点表示的事件的最迟发生时间vl。 -
活动的时间余量:等于活动最迟开始时间-活动最早开始时间。
(2)时间余量求解思路
- 拓扑排序–>事件的最早发生时间
- 逆拓扑排序–>事件的最迟发生时间
- 事件的最早发生时间–>活动的最早发生时间
- 事件的最迟发生时间–>活动的最晚发生时间
(3)性质
- 若关键活动耗时增加,整个工程的工期将增长。
- 当关键活动缩短到一定程度时,关键活动可能会变成非关键活动。
- 只提高一条关键路径上关键活动速度不能缩短整个工程工期,只有加快所有关键路径的关键活动才能缩短工期。
|