数据结构与算法分析
Vl(k):事件Vk的最迟发生时间
是在保证汇点Vn在Ve(n)时刻完成的前提下,事件Vk的允
许的最迟开始时间。在不推迟工期的情况下,一个事件最
迟发生时间Vl(k)应该等于汇点的最早发生时间Ve(n )减去
从Vk到Vn的最大路径长度。 28
24 5
Ve(n ):58
a1=8 1 a2=12
a3=14
tpord[++rear]=k;
p=p->next; }
}
if(m<n)
printf("\n the network has a cycle\n");
正拓扑顺序?
队列变化? 最后的front,rear值?
a1=4 1
2 a3=14 a4=10
a7=6
5 a8=8
4 a6=8
7 a10=12 8
a2=12 3
a5=18
6 a9=6
求Ve(k)
01 2 34 5 6 7 Ve(k) 00 08 012 022 028 040 3406 508
tpord 12345678
8
28
2
5
a1=8
0
1
a7=6
a3=14 22 4
a8=8
3466a10=12 58
7
8
a2=12 1a24=10 3
a6=8
拓扑:队列: tpord[n]; int front=-1,rear=-1;
初始化
void criticalpath(vexnode dig[])
{
int i,j,k,m;
int front=-1,rear=-1; 尾指针初值
//用队列。顺序队列的首
int tpord[n],vl[n],ve[n];
4 a6=8
7 a10=12 8
a2=12 3
a5=28
6 a9=6
数据结构:AOE图
typedef struct node
2
5
{ int adjvex; int dur; struct node *next;
a1=8 1
a3=14
a4=10
a7=6 4 a6=8
}edgenode;//边表结点 a2=12 3 a5=28 6
逆序的潜在条件
模型
k1
j ACT[j][k] k
k2 S kn
while(p)//遍历j的所有出边(j,k),改vl[j] { k=p->adjvex;
if(vl[k]-p->dur<vl[j]) vl[j]=vl[k]-p->dur;
if(dig[k].id==0) tpord[++rear]=k;
j ai
2
5
a1=8 1
a3=14 a4=10
a7=6 4 a6=8
a8=8 7 a10=12 8
a2=12 3
a5=28
6 a9=6
若活动ai 在边< Vj , Vk>上, 则e(i) 是顶点Vj 最早时间。事 件Vj发生,表明以Vj为终点的活动全部结束。所以,以Vj 为起点的所有活动ai可以立即开始。
int l[maxsize],e[maxsize];
edgenode *p; for(i=0;i<n;i++)初始化,建立入度为0的队列。
{ ve[i]=0;
if(dig[i].id==0) tpord[++rear]=i;
m=0;}
//计数拓扑排序的顶点数
Step1:求Ve(k)
从源点V1出发,令Ve(1) = 0,按拓扑序列次序求出其余各 顶点事件的最早发生时间:
路径长度、关键路径、关键活动:
路径长度:是指从源点到汇点路径上所有活动的持续时间 之和。
关键路径:完成工程的最短时间是从源点到汇点的最大路 径长度。因此,把从源点到汇点具有最大长度的路径称为 关键路径。
一个AOE中,关键路径可能不只一条。 关键活动:关键路径上的活动称为关键活动。 在关键路径长度的范围内,可以安排并行的活动
l(i) = e(i) …………..( 3 )
l(i) = e(i)表示活动是没有时间余量的关键活动。由上述分 析知,为找出关键活动,需要求各个活动的e(i)与l(i),以
判别一个活动ai是否满足l(i) = e(i)。
Ve(k) 和Vl(k)可由拓扑排序算法得到。
e(i): e(i)= Ve(j)
dig[k].id--;
j
k if(ve[j]+p->dur>ve[k])
ve[k]=ve[j]+p->dur;
if(dig[k].id==0)
jn
tpord[++rear]=k;
方法
p=p->next; }
求ve[k]
while(front!=rear) //栈非空循环,拓扑顺序遍历AOE求Ve[j]
AOE网研究的主要问题:
如果用AOE 网表示一项工程,那么仅仅考虑各个子工程 之间的优先关系还不够,更多地是关心整个工程完成的最 短时间是多少,哪些活动的延迟将影响整个工程进度,而加 速这些活动能否提高整个工程的效率,因此AOE网有待研 究的问题是: (1) 完成整个工程至少需要多少时间? (2) 哪些活动是影响工程进度的关键活动?
关键路径与关键活动
复习关键路径概念:完成工程的最短时间是从源点到汇点 的最大路径长度。因此,把从源点到汇点具有最大长度的 路径称为关键路径
要找出关键路径,必须找出关键活动,即不按期完成就会 影响整个工程完成的活动。
关键活动概念:那些满足l(i) = e(i) 的活动ai 关键路径上的所有活动都是关键活动。因此,只要找到了
40
6
a9=6
a5=28
10 21 31 42 51 62 72 81
2
3
4
4
6
5
6
7
7
8
Step2(回退阶段):
从汇点Vn出发,令Vl(n) = Ve(n),按逆拓扑有序求其余各 顶点的最晚发生时间:
Vl(j) = min{ Vl(k)-ACT[j][k] } k∈S
其中S是以顶点Vj为头的所有边的尾顶点的集合(2≤j≤n-1)
事件用“发生”描述。 e(i):活动ai的最早开始时间。没有v的符号就是表
示活动,括号中是活动的编号,e表示最早开始时 间,l表示最晚。 l(i):活动ai的最晚开始时间。 活动用“开始”
Ve(j) :事件vj的最早发生时间
Ve(j)=从源点V1 到顶点Vj 的最长路径长度。
2
5
a1=8 1
a7=2 22
a8=8
20
46
4 a4=10
3 12
a5=28
a6=8 26 7
40 6
a9=6
a10=12
58 8
Ve(4 ):22
还有什么V含l(4义):?32=以58v-k2为6 终点的活动的最迟完成时间。
L(i) :活动ai 的最迟允许开始时间
Vj ai Vk
是指在不会引起工期延误的前提下,活动ai允许的最迟 开始时间。因为事件Vk发生表明以Vk为终点的入边所表 示的所有活动均已完成,所以事件Vk的最迟发生时间Vl(k) 也是所有以Vk为终点的入边<Vj , Vk>所表示的活动ai可 以最迟完成时间。显然,为不推迟工期,活动ai的最迟开 始时间Ll(i)应该是ai的最迟完成时间Vl(k)减去ai的持续时 间,即
举例:奥运会竞赛日程
地点:主会场 需要考虑的场地:中心、跑道、沙坑 需要考虑的项目:短跑、长跑、马拉松、铅球、跳高、跳
远。。。 源点:开幕式;终点:闭幕式
术语: ve(j),vl(j), e(i), l(i),
ve(j):事件vj的最早发生时间。事件用v标识,事件 的编号用括号中的数字标识,v的下标区分“最早” 和“最晚”。 vl(j):事件vj的最晚发生时间。
在带权的有向图中, 用结点表示事件:所有入边上进行的活动均已完成的事件 用边表示活动:起始结点事件发生后所开展的活动 边的上权表示活动的开销(如持续时间) 则称此有向图为“边表示活动的网络”,简称AOE网。
a1=8 1
2 a3=14 a4=10
a7=6
5 a8=8
4 a6=8
7 a10=12 8
a8=8 7 a10=12 8
a9=6
typedef struct
{ vextype vertex;
//顶点标识
int id;
//入度
edgenode *link;
//指向出边表
}vexnode;
//顶点表结点
vexnode dig[n];
//AoE网数据表示
数据结构:Ve,Vl,e,l
数组 int vl[n],ve[n]; int l[maxsize],e[maxsize];
a2=12 3
a5=28
6 a9=6
AOE网的性质
活动开始时间:只有在某个顶点所代表的事件发生后,从 该顶点出发的各有向边代表的活动才能开始;
事件发生时间:只有在进入某一顶点的各有向边代表的活 动已经结束,该顶点所代表的事件才能发生;
表示实际工程计划的AOE网应该是无环的,并且存在唯一 的入度为0的开始顶点(源点)和唯一的出度为0的结束点 (汇点)。
Ve(k) = max{ Ve(j)+ACT[j][k] } j∈T
其中T是以顶点Vk为尾的所有边的顶点集合(2≤k≤n) 如果
网中有回路,不能求出关键路径则算法中止;否则转