考研408最小生成树算法与最短路径算法总结

最小生成树和最短路径都是图的应用
1.最小生成树算法(现实中用于城市道路规划):prim算法,kruskal

prim算法:
从一个点开始,每次找该点集合里面所有相连的边中最短的边,加入边集合,直到所有的点连通,构成最小生成树
在这里插入图片描述

在这里插入图片描述

kruskal算法:
1.将图中所有边对象(边长、两端点)依次加入集合(优先队列)q1中。初始所有点相互独立。
2.取出集合(优先队列)q1最小边,判断边的两点是否联通(分为直接和间接)。
3.如果联通说明两个点已经有其它边将两点联通了,跳过,如果不连通,则使用union(并查集合并)将两个顶点合并,这条边被使用(可以储存或者计算数值)。
4.重复2,3操作直到集合(优先队列)q1为空。此时被选择的边构成最小生成树。

在这里插入图片描述
在这里插入图片描述
prim和kruskal都是贪心算法(贪心算法,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择 。prim和kruskal的贪心策略不同。
prim适合稠密图,kruskal适合稀疏图。Prim算法适合边稠密图,时间复杂度O(n²),Kruskal算法与边有关,适合于稀疏图O(eloge),kruskal是先把边的权值排序一次再进行选择。

2.最短路径:Dijkstra,Flyod

Dijkstra算法:
从dis数组(原点到其他各个顶点当前的最短路径)选择最小值,则该值就是原点s到该值对应的顶点的最短路径,并且把该点加入到T中,此时完成一个顶点。
然后,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。
然后,又从dis中找出最小值,重复上述动作,直到T中包含了图的所有顶点。
以下图为例,找出从顶点v1到其他各个顶点的最短路径。
在这里插入图片描述
此时顶点集合T的初始化为:T={v1}
在这里插入图片描述
此时顶点集合T的初始化为:T={v1,v3}
在这里插入图片描述
顶点集合: T={v1, v3, v5}
在这里插入图片描述
顶点集合: T={v1, v3, v5, v4}
在这里插入图片描述
最后,顶点集合: T={v1, v3, v5, v4, v6, v2}

在这里插入图片描述

Floyd算法:各个顶点之间的最短距离,暴力破解法,通过循环的方式,时间复杂度比较高,对于稀疏图将会生成稀疏矩阵,极大浪费了储存空间。
初始化矩阵,将所有相邻的节点对应的权值写入矩阵,不相邻的节点对应的权值初始化为inf,如下面的例子所示:
在这里插入图片描述
初始化结束后,开始循环,每层循环从第一个节点开始遍历,直至遍历到第n个节点,则以节点i为中介点,以节点j为起点,节点k为目标点,判断由起点j经由中介点i到达目标点k的代价值是否小于由起点j直接到目标点k的代价值,若小于,则将从起点j到目标点k的代价值d[j][k]更新为d[j][i]+d[i][k]。循环结束后,路径规划结束。每个顶点都做一次中间点,当所有结点循环完以后,算法结束。
① 以A为中介点,分别更新B/C/D/E/F/G经中介点A到其他节点的累积权值
在这里插入图片描述
② 以B为中介点,分别更新A/C/D/E/F/G经中介点B到其他节点的累积权值
在这里插入图片描述
③ 以C为中介点,分别更新A/B/D/E/F/G经中介点C到其他节点的累积权值
在这里插入图片描述
④ 以D为中介点,分别更新A/B/C/E/F/G经中介点D到其他节点的累积权值
在这里插入图片描述
⑤ 以E为中介点,分别更新A/B/C/D/F/G经中介点E到其他节点的累积权值
在这里插入图片描述
⑥ 以F为中介点,分别更新A/B/C/D/E/G经中介点A到其他节点的累积权值
在这里插入图片描述
⑦ 以G为中介点,分别更新A/B/C/D/E/F经中介点G到其他节点的累积权值
在这里插入图片描述

3.最小生成树和最短路径的区别和关系:
最小生成树能够保证首先是树(对于n个顶点的图只有n-1条边),其次保证任意两个顶点之间都可达,再次保证这棵树的边权值之和为最小,但不能保证任意两点之间是最短路径; 最短路径保证从源点S到目地点D的路径最小(有向图中不要求终点能到起点),不保证任意两个顶点都可达; 最小生成树是用最小代价遍历整个图中所有顶点,所有的权值和最小。而最短路径只是保证出发点到终点的路径和最小,不一定要经过所有顶点; 最小生成树是到一群点(所有点)的路径代价和最小,是一个n-1条边的树,最短路径是从一个点到另一个点的最短路径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值