(C/C++)数据结构八:图的应用

最小生成树

生成树

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

所有生成树具有以下共同特点:

  1. 生成树的顶点个数与图的顶点个数相同
  2. 生成树是图的极小连通子图,去掉一条边则非连通
  3. 一个有n个顶点的连通图的生成树有n-1条边
  4. 在生成树中再加一条边必然形成回路
  5. 生成树中任意两个顶点间的路径是唯一的
  6. 一个图可以有许多棵不同的生成树

含n个顶点n-1条边的图不一定是生成树

最小生成树

给定一个无向网,在该网的所有生成树中,各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树

哈夫曼树是叶子带权值,最小生成树是边带权值

最小生成树的构造

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

由MST性质得:v1到v3的边一定包含在最小生成树中\in

在生成树的构造过程中,图中n个顶点分属两个集合:已落在生成树上的顶点集U,尚未落在生成树上的顶点集V-U。接下来则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边

Prim(普里姆)算法

算法思想:

设N=(V,E)是连通网,TE是N上最小生成树中边的集合

初始令U={u0},{u0\inV},TE={}。

在所有u\inU,v\inV-U的边(u,v)\inE中,找一条代价最小的边{u0,v0} 

将(u0,v0)并入集合TE,同时v0并入U

重复上述操作,直至U=V为止,则T={V,TE}是N的最小生成树

KrusKal(克鲁斯卡尔)算法

算法思想:

设连通网N=(V,E),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V,{}),每个顶点自成一个连通分量

在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即:不能成为环),则将此边加入到T中,否则舍去此边,取下一个代价最小的边

以此类推,直至T中所有顶点都在同一连通分量上为止

两种算法的比较

算法名普里姆算法克鲁斯卡尔算法
算法思想选择点选择边
时间复杂度O(n^2)(n为顶点数)O(eloge)(e为边数)
适应范围稠密图稀疏图

最短路径

在有向网中A点到达B点的多条路径中,寻找一条各边权值之和最小的路径,即最短路径

第一类问题:两点间最短路径,第二类问题:某起点到其他各点的最短路径

Dijkstra(迪杰斯特拉)算法

用来解决第一类问题

  1. 初始化:先找出从源点v0到各终点vk的直达路径(v0,vk),即通过一条弧到达的路径
  2. 选择:在这些路径中找出一条长度最短的路径(v0,u)
  3. 更新:然后对其余各条路径进行适当调整

                若在图中存在弧(u,vk),且(v0,u)+(u,vk)<(v0,vk)

                则以路径(v0,u+vk)代替(v0,vk)

      在调整后的各条路径中,再找长度最短的路径,依此类推

 Floyd(弗洛伊德)算法

算法思想:

逐个顶点试探,从vi到vj的所有可能存在的路径中寻找一个长度最短的路径

有向无环图及其应用

有向无环图:无环的有向图

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

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

拓扑排序

AOV网的特点

  1. 若从i到j有一条有向路径,则i是j的前驱,j是i的后继
  2. 若<i,j>是网中有向边,则i是j的之间前驱;j是i的之间后继
  3. AOV网不允许有回路

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

方法

  1. 在有向图中选一个没有前驱的顶点且输出之
  2. 从图中删除该顶点和所有以它为尾的弧
  3. 重复上面两步,直至所有顶点均已输出,或者当图中不存在无前驱的顶点为止

 一个AOV网的拓扑序列不唯一

检测AOV网中是否存在环

        对有向图构造的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网比如不存在环

关键路径

用AOE网,顶点表示事件,弧表示活动,弧的权表示活动持续时间

源点:入度为0的顶点

汇点:出度为0的顶点

对于AOE网我们关心两个问题:

1、完成整项工程至少需要多少时间

2、哪些活动是影响工程进度的关键

关键路径——路径长度最长的路径

路径长度——路径上各活动持续时间之和(权值最大)

对于关键路径,需要定义四个描述量:

 

l(i)-e(i)——表示完成活动ai的时间余量

关键活动——关键路径上的活动,即I(i) == e(i)(即l(i)-e(i) ==0)的活动

最早发生时间:前面的活动都得进行完才能进行,所以是MAX{前面事件的最早发生时间+权值}

最晚发生时间:想要完成后面的事件,必须满足权值最大的活动也能完成,所以是MIN{后面事件的最完发生事件-权值}

 e(i) = ve(j)

l(i) = vl(k) - w_{j,k}

1、若网中有几条关键路径,则需加快同时在几条关键路径上的关键活动

2、如果一个活动处于所有的关键路径上,那么提高这个活动的速度能缩短整个工程的完成时间

3、处于所有的关键路径上的活动完成时间不能缩短太多,否则会使原本的关键路径变成不是关键路径,这时必须重新寻找关键路径

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值