floyd算法
2016-03-09 23:13
162 查看
求两个顶点间的最短距离,直觉是这样的问题可以用尝试和枚举的办法来求解,这显然可行,但是我们可以换个方式来看待这个问题,比如, 可以这样描述,“在给定的点集(编号为1~k,k=图中所有的顶点数量)中,i,j之间的最短路径长度"(称为p1), 基于这样一个描述我们可以对问题规模进行缩减得到另一个问题"在给定的点集(编号为1~k-1)中,i,j之间的最短路径长度"(称为p2), 可以再次缩减问题,即"在给定的点集(编号为1~k-2)中,i,j之间的最短路径长度", 照此类推,直到点集不能再缩减(只有i,j),我们便到达了一个终极子问题,如果我们总是可以用一个子问题的解,得到比该子问题多一个顶点的问题的解,那么可以想见,我们可以从终极子问题出发,逐步求解,直到得到母问题的解。下面我们尝试找到这两个点集相差一个的问题之间的关系,以p1和p2的关系为例,用更加简洁的式子来表示问题,p1 表示为ShortestPath(i,j,k), p2表示为ShortestPath(i,j,k-1), p1比p2多了一个编号为k的顶点,那么会有两种可能:
1. 虽然多了点集中多了一个编号为k的顶点,但ShortestPath(i,j,k) = ShortestPath(i,j,k-1), 也就是说并没有因为加入了新的顶点k而出现新的最短路径
2. 因为加入了顶点k ShortestPath(i,j,k)有一条新的最短路径,要短于 ShortestPath(i,j,k-1), 我们也可以得出这条新的最短路径必然经过顶点k(如果不经过k,那么最短路径不可能变短),这时最短路径可以表示为ShortestPath(i,k,k-1),+ShortestPath(k,j,k-1)。
基于以上两种可能,继续得到ShortestPath(i,j,k) = min(ShortestPath(i,j,k-1),ShortestPath(i,k,k-1),+ShortestPath(k,j,k-1))
1. 虽然多了点集中多了一个编号为k的顶点,但ShortestPath(i,j,k) = ShortestPath(i,j,k-1), 也就是说并没有因为加入了新的顶点k而出现新的最短路径
2. 因为加入了顶点k ShortestPath(i,j,k)有一条新的最短路径,要短于 ShortestPath(i,j,k-1), 我们也可以得出这条新的最短路径必然经过顶点k(如果不经过k,那么最短路径不可能变短),这时最短路径可以表示为ShortestPath(i,k,k-1),+ShortestPath(k,j,k-1)。
基于以上两种可能,继续得到ShortestPath(i,j,k) = min(ShortestPath(i,j,k-1),ShortestPath(i,k,k-1),+ShortestPath(k,j,k-1))
相关文章推荐
- Climbing Stairs
- nyoj--20 吝啬的国度(dfs)
- JAVA移位运算符
- 小代码3 魔方矩阵
- 多个参数的方法
- Block再识
- 集体智慧编程——优化搜索算法:爬山法,模拟退火算法,遗传算法-Python实现
- Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析
- C语言详解 枚举
- dlang操作mysql
- HBase 4、Phoenix安装和Squirrel安装
- 一周总结
- mysql学习(2):mysql配置,启动常见错误
- POJ 2503
- 小代码2
- canvas 画布 文字描边
- 获得UILable的高度
- 字符变量存放多个字符
- 汇总#pragma用法
- FZU 1205 小鼠迷宫(搜索)