图的应用—拓扑排序
一、有向无环图
针对:有向无环图:没有形成回路的有向图。类似于树
有向无环图通常用来描述一个工程或系统的进行过程(通常把计划、施工、生产、程序流程图当成一个工程),且一个工程可以分为若干个子工程,只要完成这些子工程,就可以导致整个工程的完成。
AOV网:
用一个有向图表示一个工程的各子工程及其相互制约的关系,其中顶点表示活动、弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网
特点:
若从i到j有一条有向路径,则i是j的前驱;j是i的后继。
从i到j其中可以有其他的结点,比如从c1到c5是一条有向路径。其中c1是c5的前驱,c5是c1的后继
若<i,j>是网中的有向边,则i是j的直接前驱,j是i的直接后继。
从i到j中间不能有其他结点,比如c1到c3,c1是c3的直接前驱,c3是c1的直接后继
拓扑排序(将一个网变成一个线性序列)
在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<i,j>存在,则在整个序列内,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排列算法称为拓扑排序。
思路:
在有向图中选一个没有前驱的顶点且输出之: 选择c1
从图中删除该顶点和所有以它为尾的弧。 从图中删除c1及其有向边重复上面两部,直到全部顶点均已输出,或者当图中不存在无前驱顶点位置。
输出的序列就是一个拓扑序列(因此拓扑序列不是唯一的,但是在整个序列表内,前驱一定在后继的前面)
利用拓扑排序就可以检测AOV网中是否存在环:如果所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。
AOE网:
用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束时间(活动的开始点或者结束点),称这种有向图为边表示活动的网
把工程计划表示为边表示活动的网络,用顶点表示事件、弧表示活动,弧的权表示活动持续时间
事件表示:在它之前的活动已经完成,在它之后的活动可以开始
关键路径:
设一个工程由11项活动,9个事件。
其中事件v1表示工程的开始(源点:入度为0的顶点),事件v9表示整个工程的结束(汇点:出度为0的顶点)。
对于AOE网,我们一般关系两个问题:1.完成整个事件需要的事件,2.那些活动是影响工程进度的关键。
关键路径——路径长度最长的路径。(是影响工程进度的关键)
路径长度——路径上各活动持续时间之和。()
对于确定关键路径需要定义四个描述量:
1.ve(vj)—表示事件vj的最早发生时间
源点 的ve(v1)= 0, ve(v2) = 62.vl(vj)—表示事件vj的最迟发生时间
从汇点往回推,推点此点最迟发生时间才能保证工程能正确完成
vl(v7)= 整个工程总时间 - a10(v7时间开始后所需要的时间)3.e(i)表示活动ai的最早开始时间(边)
e(a4) = 64.l(i)表示活动ai最迟开始时间
e(a8) = 整个工程总时间 - a11 - a8(最短需要时间才能完成的项目)l(i) - e(i)—表示完成活动ai的时间余量 ,表示可以在这某段时间的任意时间开始执行,都不会影响进度。
关键活动—关键路径上的活动即l(i)== e(i),没有活动余量。关键路径由多个关键活动构
e(i) = ve(j)
l(i) = vl(k) - wj,k(wj,k为持续时间)ve(j) = 前驱结点的时间 加上 当前活动的持续时间
从源点向汇点推算,如果由多个值,取最大值vl(k) = 后继结点的时间 减去 当前活动持续时间
从汇点向源点推算,如果有多个值,取最小值
求最早发生时间
等所有执行完才能执行下一个Vj。
也就是说最长时间是等Vx执行完,才能开始执行到Vj,也就是82+6 = 88.所以ve(vj) = 88
求最晚发生时间
等所有执行完才能执行下一个Vn。
也就是说最长时间是等Vu执行完,才能执行到Vn
汇点要求10(天/小数)完成,由总时间 - 每条的持续时间求出
最迟发生时间 vl(Vj) = 10 - 持续时间 求出最小值 ,即vl(Vj) = 0
例子:
1.求ve(i), vl(i)
2.求 e(i), l(i)
3.计算 l(i) - e(i)
1.源点最早发生时间 ve(v1) = 0
2.v2、v3、v4最找发生事件要等事件a1、a2、a3 结束才可以执行,也就是ve(v2) = 6、 ve(v3) =4 、ve(v4) = 5
3. v5顶点有两个前置事件,必须都执行完才可以执行v5。有两个时间段,一个经过v2的7,一个经过v3的5,选择多个时间的最大值7,因此ve(v5) = 7
4. 其余节点类似
1.汇点最晚发生事件 vl(v9) = el(v9) =18
2.v7、v8的最晚发生事件 = 后继结点的最晚时间 - 事件的持续时间。也就是 vl(v8) =18 -4 =14 vl(v7) = 18 -2 =16。
3.v5的顶点有两个后继时间,意味着 v5的最晚发生时间要能使后面事件有最小的足够时间完成
vl(v7) - a7、vl(v8) - a8 都等于 7,vl(v5) = 74.其余结点类似
求活动的余量,要求出活动的最早和最晚开始时间,在相减。
弧e(i) = 弧尾的最早发生时间
弧l(i) = 弧头的最早发生时间 - 时间的持续时间
求出活动余量,活动余量为零 = 关键活动
关键路径有关键活动组成
如果网中有几条关键路径,则需加快同时在几条关键路径上的关键活动。
a、a8、a10 和a11要同时加快如果一个活动处于所有的唯一的一条关键路径上,提高整个活动就能加快。
a1、a4加快都能缩短时间且互不影响。但是不能缩短过多,否则可能会使原来的关键路径变成不是关键路径,这些必须重新寻找关键路径。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)