Dijkstra和Prim算法 【含数学证明】

#ACM&算法


不知是不是因为自己的抽象学习能力还是不够强,之前在翻阅别人博客学习这两个算法的时候,整个人一直处于懵逼状态。

分析了一下,发现之前存在的博客教程,大多趋向于方法讲解,学完以后有知其然不知其所以然的感觉。另一部分博客则偏向数学证明,语言严谨但理解起来确实要费一番功夫。所以打算尝试一下在下文里以解决一个问题的方式讲解这两个算法。


在敲算法之前先阐明一下这两个算法所能解决的问题,先从Dijkstra开始。


举个栗子


我们现在拿到了一张无向图,如下:

这是一个由7个节点和10条边组成的无向图。每条路上的数字代表这条路的长度。
现在任选其中两个点,我们需要找到一条路把它们连起来,并使这条路尽可能的短。

根据动态规划的思路,我们把这个问题化解成一个较小的问题去解决。我们将挑选两个紧挨着(有边直接相连)的点,A和B。

显而易见,如果从A到B有一条路能联通的话,那这条路只有两种可能:
1,这条路只有一条边,直接连接A和B。
2,这条路有多条边,从A出发,经过其他点中转,到达B。

那我们分别来讨论。
这两种方法的共同点就是,都要从A点出发。而从A点出发的路是有限的。那也就是说,如果从A出发直达B的这条路是从A出发所有路中最短的一条,那么这条路一定是AB间的 最短路
证明也很简单,因为 所有路的长度都是正数,所以如果有另一条路从A出发绕过某些点到达B的话,那它一定会在从A出发的所有路的长度的基础上再加上一些数(至少为0)。也就绝对不可能小于AB直接连接的长度。
如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值