[算法学习no10]Floyd算法以及其正确性证明

具体原理
就是把图里面所有点
拿出一个
遍历所有路径
看看能不能把这个点加入到这个路径里面
也就是进行判断:
dis[i,j]>dis[i,k]+dis[k,j]
如果满足就要更新dis[i,j]的值
完毕
非常简单易于上手

现在思考其正确性:
如果一条路
4->3->1->2->5->6为4->6的最优解.
从这个图中我们可以看到,一定可以直接连通的点就是
4,3
3,1
1,2
2,5
5,6
Floyd算法是在把这些路都找出来,然后拼接成成品的一个过程
我们已经知道了上面那些条件了。
所以在拼接过程中,对于任意的k,一定没发生dis[i,j]=dis[i,k]+dis[k,j]
这些都是最优且最小单元选择
而且随便找出来两个结点,这两个结点的连线都是最优的
那么遍历1的时候,一定会出现[3,2]>[3,1]+[1,2];然后发生[3,2]=[3,1]+[1,2] 已经连上了32
然后遍历2的时候,一定会出现[1,5]>[1,2]+[2,5];然后发生[1,5]=[1,2]+[2,5] 已经连上了15
由于上面已经出现了[3,2]=[3,1]+[1,2]为所有图形中的最优解
那么一定也会发生[3,5]>[3,2]+[2,5];然后发生[3,5]=[3,2]+[2,5] 已经连上了35
然后遍历3的时候,一定会出现[4,1]>[1,3]+[1,2];然后发生[3,2]=[3,1]+[1,2]等等,
宏观来看,上面已经连上了35,那么我们这里一定可以成功连上45
然后遍历4,4为路径起点,无意义遍历
然后遍历5,前面我们已经连上了45,5和6直接相连且最优,那么我们一定可以连上46
结束!!!
我来总结一下
我的论证思路:
就是随便找个结点序列当作某条路径的最优解
那么这个点上面任意取两个点,这两个点都是最优路径,不然就会有其它路径来替换
那么只要我们在遍历过程中,能够把这些点连接起来就可以了
从相邻点开始链接,我们的路径会越来越长
这样在遍历的过程中,就会把最优解求出来
把这条路径编号改变,依旧成立
故floyd算法可以把所有点之间的最短路径求出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值