动态规划、最短路径、Floyd算法

正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。

Floyd算法的基本思想如下:

  1. 从任意节点A到任意节点B的最短路径不外乎2种可能:1是直接从A到B;2是从A经过若干个节点X到B。
  2. 所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立;
  3. 如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离。

求最短路径的代码如下:
for (int k = 0; k < 节点个数; ++k )
{
    for (int i = 0; i < 节点个数; ++i )
    {
        for (int j = 0; j < 节点个数; ++j )
        {
            if ( Dis[i][k] + Dis[k][j] < Dis[i][j] )
            {
                // 找到更短路径
                Dis[i][j] = Dis[i][k] + Dis[k][j];
            }
        }
    }
}



同样Floyd算法其实是采用了动态规划的思想。可应用于求路径数、方案数等问题。
其中一个例子如下:求规定在L的长度内,从a走到b的方案数。
	for(k=1; k<=l; k++){
	<span style="white-space:pre">	</span>for(i=1; i<=n; i++){
			for(j=1; j<=n; j++){
				if(edge[i][j] == 1){  //如果从i能到达j
					 //第k天到达j的方案数 += 第k-1天到达i的方案数 
					result[k][j] += result[k-1][i];  
				}
			}
		}
	}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值