动态规划3-Warshall算法和Floyd算法

本文介绍了动态规划中的Warshall算法和Floyd算法,用于求解有向图的传递闭包和完全最短路径。Warshall算法通过逐步加入顶点构建传递闭包,Floyd算法则通过迭代寻找最短路径。两者都有时间复杂度为O(n^3),可通过优化在原矩阵上更新减少空间复杂度。同时,文章探讨了如何在Floyd算法中记录最短路径信息。
摘要由CSDN通过智能技术生成
上2篇详细分析了动态规划的一些理解,传统的教材上就大概说了下空间换时间,记忆以避免重复计算等。


然后我们在文章中深入的分析和解释了交叠子问题是怎么表现的,最优子结构的表现,多阶段决策(无后效性)的表现,递推式(状态转移方程),一个状态表示一个子

问题的解,动态规划就是将问题划分为规模不是太大的子问题,动态规划填矩阵的顺序(拓扑排序)以及空间复杂度的优化跟什么有关等等。


计算二项式系数其实可以看成是不是解决最优问题的一个动态规划的特例,这节我们再来介绍2个动态规划的算法:Warshall算法(也可以说是不是最优问题,但它也可

以表现为动态规划的过程)和Floyd算法。

----------------------------------------------------------------------------------------------------------------------------------------------------


1,Warshall算法求传递闭包


问题的定义:





有向图的传递闭包表达的就是每个顶点之间的可达性 。当然,可以从每个起点开始深度或广度优先遍历,能遍历到的顶点就说明从这个点到它可达,这样来生成传递闭

包。这样做对图进行了多次遍历,我们希望找到更好一点的办法:


Warshall算法通过动态规划的形式, 以多阶段决策的方式来逐步构建 一个有向图的传递闭包:

1)有向图的邻接矩阵表示了一个有向图,实际上有向图的邻接矩阵我们可以看作是 没有经过任何中间顶点 即一个点仅到它的邻接点为可达 )的图的传递闭包(传递

闭包的初始条件)

2)我们可以通过一次加入一个点的方式(一共n次,加入n个点,n步决策)来构造最终的传递闭包:

---- 用R0表示邻接矩阵,以后每次加入一个顶点来构造R1,R2.......Rn

---如果 r(i , j) 在Rk-1中为1,那么加入顶点k作为中间节点后,r(i , j) 在Rk中的值仍为1(如果可达了,加入点之后肯定还是可达)

--如果r(i , j)在Rk-1中不为1,仅当 r(i , k) = 1 且 r(k , j) = 1,r(i , j)在Rk中才为1(如果现在不可达,仅当加入的一个中间节点可以作为一个桥梁使之可达,才

可达)


即下面2条规则:





如果不想分2种情况,用与或式可以直接写成下式:



括号在”或“后面。


伪代码:




实现如下:

复制代码
  
  
  
package Section8;


/* 第八章 动态规划 有向图传递闭包的Warshall算法 */

public class Warshall {

/**
*
@param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值