【数据结构】图4——图的应用(最小生成树、最短路径、有向无环图)


生成树

生成树定义:所有顶点均由边连接在一起,但不存在回路的图。

一个图可以有许多棵不同的生成树。
在这里插入图片描述

所有生成树具有以下共同特点:
① 生成树的顶点个数与图的顶点个数相同;
② 生成树是图的极小连通子图,去掉一条边则非连通;
③ 一个有n个顶点的连通图的生成树有n-1条边;
④ 在生成树中再加一条边必然形成回路;
⑤ 生成树中任意两个顶点间的路径是唯一的;
⑥ 含n个顶点n-1条边的图不一定是生成树。
在这里插入图片描述

无向图的生成树
在这里插入图片描述
① 设图G=(V, E)是个连通图,当从图任一顶点出发遍历图G时,将边集E(G)分成两个集合T(G)和B(G)。
② 其中T(G)是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边的集合。
③ 显然,G1(V, T)是图G的极小连通子图。即子图G1连通图G的生成树。

最小生成树

定义:
给定一个无向网络,在该网的所有生成树中,使得各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树。
最小生成树有时候不是唯一的。
在这里插入图片描述

构造最小生成树(MST)

Minimum Spanning Tree——MST

构造最小生成树的算法很多,其中多数算法都利用了MST的性质。

MST性质:设N=(V,E)是一个连通网,U是顶点集V的一个非空子集。若边(u,v)是一条具有最小权值的边,其中u∈U, v∈V-U,则必存在一棵包含边(u, v)的最小生成树。
实质上,MST性质是一种贪心算法

在这里插入图片描述
MST性质解释:
在生成树的构造过程中,图中n个顶点分属两个集合:
已落在生成树上的顶点集:U
尚未落在生成树上的顶点集:V-U

构造最小生成树方法

普里姆(Prim)算法

【算法思想】
① 设N=(V,E)是连通网,TE是N上最小生成树中边的集合。
② 初始令U={u0}, (u0∈V), TE={}。
③ 在所有u∈U,v∈V-U的边(u,v)∈E中,找一条代价最小的边(u0,v0)。
④ 将(u0,v0)并入集合TE,同时v0并入U。
⑤ 重复上述操作直至U=V为止,则T=(V, TE)为N的最小生成树。
在这里插入图片描述

克鲁斯卡尔(Kruskal)算法

【算法思想】
① 设连通网N=(V, E),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V, {}),每个顶点自成一个连通分量。
② 在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即:不能形成环),则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边。
③ 依此类推,直至T中所有顶点都在同一连通分量上为止。

两种算法比较

在这里插入图片描述

最短路径

定义:
在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径, 即最短路径。

最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n-1条边。

常见问题:

① 第一类问题:两点间最短路径

在这里插入图片描述
② 第二类问题:某源点到其他各点最短路径

在这里插入图片描述
解决办法:
① 单源最短路径——用Dijkstra(迪杰斯特拉)算法
② 所有顶点间的最短路径——用Floyd(弗洛伊德)算法

迪杰斯特拉(Bijkstra)算法

【算法思想】
1、初始化:先找出从源点v0到各终点vk的直达路径(v0,vk),即通过一条弧到达的路径。
2、选择:从这些路径中找出一条长度最短的路径(v0,u)。
3、更新:然后对其余各条路径进行适当调整:
若在图中存在弧(u,vk) ,且(v0,u) + (u,vk) < (v0,vk),则以路径(v0,u,vk) 代替(v0,vk)
在调整后的各条路径中,再找长度最短的路径,依此类推。

迪杰斯特拉(Dijkstra)算法:按路径长度递增次序产生最短路径
1、把V分成两组:
① S:已求出最短路径的顶点的集合。
② T=V-S:尚未确定最短路径的顶点集合。
2、将T中顶点按最短路径递增的次序加入到S中
保证: ① 从源点V0到S中各顶点的最短路径长度都不大于从V0到T中任何顶点的最短路径长度。
② 每个顶点对应一个距离值:
S中顶点:从V到此顶点的最短路径长度。
T中顶点:从V到此顶点的只包括S中顶点作中间顶点的最短路径长度。
在这里插入图片描述

例:
Dijkstra算法步骤:
① 初始时令S={V0},T={其余顶点}。
② T中顶点对应的距离值用辅助数组D存放。
D[i][初值:若<V0, Vi>存在,则为其权值;否则为∞。
③ 从T中选取一个其距离值最小的顶点Vj,加入S。
④ 对T中顶点的距离值进行修改:若加进vj作中间顶点,从v0到vi的距离值比不加vj的路径要短,则修改此距离值。
⑤ 重复上述步骤,直到S=V为止。

D[j]=Min{D[i]|vi∈T}
在这里插入图片描述
时间复杂度:O(n*n*n)

弗洛伊德(Floyd)算法

求所有顶点间的最短路径
【算法思想】
逐个顶点试探;
从vi到vj的所有可能存在的路径中选出一条长度最短的路径。

【算法步骤】
① 初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<ViVj>,则对应元素为权值;否则为∞。
在这里插入图片描述
② 逐步试着在原直接路径中增加中间顶点,若加入中间顶点后路径变短,则修改之;否则,维持原值。所有顶点试探完毕,算法结束。
在这里插入图片描述

有向无环图(DAG图)

Directed Acycline Graph

定义:无环的有向图。
在这里插入图片描述

AOV网:
用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称AOV网(Activity On Vertex network)。

AOE网:
用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称为AOE网(Activity On Edge)。

AOE网的特点:
① 若从i到j有一条有向路径,则i是j的前驱;j是i的后继。
② 若<i,j>是网中有向边,则i是j的直接前驱;j 是i的直接后继。
③ AOV 网中不允许有回路,因为如果有回路存在,则表明某项活动以自己为先决条件,显然这是荒谬的。
在这里插入图片描述

拓扑排序

拓扑排序定义:
AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<i, j>存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序

拓扑排序方法:
① 在有向图中选一个没有前驱的顶点且输出之。
② 从图中删除该顶点和所有以它为尾的弧。
③ 重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。
在这里插入图片描述

检测AOV网中是否存在回路(环)方法:
对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。

例:
右图中已经找不到一个没有前驱的顶点
在这里插入图片描述

关键路径

定义:
从源点到汇点的所有路径,具有最大路径长度的路径成为关键路径。把关键路径上的活动称为关键活动。

描述:
把工程计划表示为边表示活动的网络,即AOE网。
用顶点表示事件,弧表示活动,弧的权表示活动持续时间。
事件表示在它之前的活动已经完成,在它之后的活动可以开始。
在这里插入图片描述
例:设个工程有11项活动,9 个事件。
事件v1——表示整个工程开始 (源点:入度为0的顶点)
事件v9——表示整个工程结束 (汇点:出度为0的顶点)
在这里插入图片描述

关键路径——路径长度最长的路径。
路径长度——路径上各活动持续时间之和。

确定关键路径方法:
需要定义4个描述量:
ve(vj)——表示事件vj的最早发生时间。
vl(vj)——表示事件vj的最迟发生时间。
e(i)——表示活动ai的最早开始时间。
l(i)——表示活动ai的最迟开始时间。
|(i) - e(i)——表示完成活动ai的时间余量
关键活动——关键路径上的活动,即 l(i)==e(i)(即|(i)-e(i)==0)的活动。
在这里插入图片描述

如何找l(i) == e(i)的关键活动?

持续时间wj,i就是边的权值。
在这里插入图片描述

如何求ve(j)和vl(i)?
在这里插入图片描述

求关键路径步骤:
1.求ve(j)、vl(i)
2.求e(i)、l(i)
3.计算l(i)-e(i)
在这里插入图片描述
在这里插入图片描述
求ve(j)时,若结点有多条路径可到达,则选择时间最大值。如:到v5有两条路径,分别是7和5,则选择7。
求vl(i)时,若有多条边以结点为弧尾(起始点),则选择时间最小值。
关键路径:
在这里插入图片描述


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值