最小生成树(Prim,Kruskal)--最短路径(Dijkstra,Floyd)算法详解

最小生成树

Prim(普雷姆)算法

以某一个顶点开始构建生成树,每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入位置。设有如下图:
从P点开始构建生成树,选择其他顶点也可
在这里插入图片描述
首先与P相连最小的代价(边)是学校,代价为1,将其并入:
在这里插入图片描述
此时与生成树相连的边有5,6,5,4,6,4,最小的代价时连渔村或者矿场,我们这里选择连矿场,选渔村的话生成的最小生成树代价不变,所以同一个图可以有多个最小生成树此时最小树生成树如图:
在这里插入图片描述
再选择代价最小的顶点并入生成树,依此类推,最小生成树:
在这里插入图片描述

Kruskal (克鲁斯卡尔)算法

每次选择一条权值最小的边,使这条边的两头联通(原本已经联通的就不选),直到所有结点都联通。
还是上面的例子:
首先选出权值最小的一条边,显然是1,使连通。
在这里插入图片描述
再选出权值最小的边,<渔村,矿场>权值为2,使连通
在这里插入图片描述
再次选择权值最小的边,显然为<农场,电站>3
在这里插入图片描述
再次重复上述步骤发现,权值最小的边有两个,<P城,矿场>4,<P城,渔村>4,而P城与这两个边均为连通,我们随便选一条,假设选择<P城,矿场>4:
在这里插入图片描述
此时P城,矿场,渔村,是连通的,不能再选择<P城,渔村>4这条边了,同理不能选择<学校,矿场>5,而是选择<农场,P城>5边。最小生成树与普雷姆算法一致。

对比

在这里插入图片描述

最短路径问题

单源最短路径:即求图中某一顶点到其他各顶点的最短路径。
使用广度优先搜索(BFS)可以实现对无权图的单源最短路径的求解。
但对于有权图来说BFS不在适用,可考虑迪杰斯特拉算法求单源路径长度,求各顶点的最短路径考虑弗洛伊德算法。

Dijkstra(迪杰斯特拉)算法

设有以下图,求V0的单源最短路径:
初始化,发现从V0可以直接到V1, V4。dist[1]表示此刻能找到的从V0到V1的最短路径,V2,V3因为不存在直接和V1相连的边,所以dist为无穷大。path表示路径结点前驱,我们此时最短路径10,5都是由V0直接指向的,所以V1,V4的前驱自然为0(V0)。
在这里插入图片描述
第一轮循环:找到还没确定最短路径(即final值为false,dist最小的顶点),顶点V4,将其设置为true,
为什么要将V4设为true?已经找到了V0到V4的最短路径了吗?是的,因为我们选择的是与V0相邻的,边权值最小的顶点,如果<V0, V4>路径通过V1中转最小,那么第一轮循环选择的顶点应该是V1而不是V4.
在这里插入图片描述
检查所有邻接V4的顶点,若其值为false,更新它的dist和path数组信息。如何更新?以V1为例子,检查到V1的路径长度通过V4中转权值会不会更小。V0通过V4中转到V1的路径为8,小于10,修改路径前驱为4。到V2的路径为(5+9)=14 < ∞,修改路径前驱。到V3的距离为5+2=7<∞,修改路径前驱。第一轮处理之后效果如图:
在这里插入图片描述
第二轮同理,循环遍历,找到结点V3,与其相连的有V0和V2,V0的final值已经为true了,不用处理,更新V2就可以。
在这里插入图片描述
到V3最短路径为7,加上指向V2的边为13 < 14, 更新dist[2]=13, path[2] =3
之后循环同理。处理结束后数组值如图:
在这里插入图片描述
求到V2的最短路径:V2的前驱是V1,V1的前驱V4,V4前驱V0,可得到最短路径V0->V4->V1->V2。

时间复杂度

经过n-1轮处理,每次都要遍历所有结点,时间复杂度为O( n 2 n^2 n2
迪杰斯特拉算法不适用负权边的情况

Floyd 弗洛伊德算法

初始化一个矩阵,表示各顶点的最短距离,其实就是邻接矩阵名为 A − 1 A^{-1} A1
刚开始,都不允许中转,path都设置为-1
在这里插入图片描述
首先,我们允许通过V0结点进行中转,V2可通过V0到达V1小于之前的无穷,更新数据如下,
在这里插入图片描述
此时得到的矩阵我们称为 A 0 A^{0} A0, 在允许通过A1中转,即k=1
在这里插入图片描述
允许V2为中转点,最后矩阵为:
在这里插入图片描述
若求V0到V2的路径,0到2的path是1,所以0是先到1,再到V2的。
代码实现
在这里插入图片描述
因为n个顶点,每个顶点都要遍历一遍矩阵,时间复杂度为O( n 3 n^{3} n3), 空间复杂度为O( n 2 n^{2} n2)
在这里插入图片描述

总结

在这里插入图片描述

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JiYH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值