【图论基础】floyd算法求最短路

今天利用空(shang)闲(ke)时间学习了floyd算法,回家整理一下笔记w


原理

这个算法本质上利用了动态规划思想,通过邻接矩阵递推出每两点之间的最短路。

首先我们需要建立一个三维数组D,用D[i][j][k]表示点i到点j经过1~k之间任意点的最短路径长度。

这个时候有两种情况:

1.设经过点k

    那么就是i到k的最短路长+k到j的最短路长:D[i][j][k]=D[i][k][k-1]+D[k][j][k-1]

2.设不经点k

    则延续过上一k点的最短路:D[i][j][k]=D[i][j][k-1]

最后比较一下那种情况路程更短就行啦:D[i][j][k]=min(D[i][k][k-1]+D[k][j][k-1],D[i][j][k-1])

因为都是k-1,所以到这里可以降一下维,来节省空间:D[i][j]=min(D[i][j],D[i][k]+D[k][j])


代码

记得要初始化,按照概念,存储两点之间的最短路,就是开个邻接表了,但记得要先将所有值设为∞,相同两点之间距离为0

然后核心代码就这么点:

for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
        {			
             if(D[i][k]+D[k][j]<D[i][j])
             {
                D[i][j]=D[i][k]+D[k][j];
             }
	}

嗯,完全是按照上面的dp公式抄的,就不多说啦

然而,时间复杂度O(n³)的最短路算法,我只见过换教室(NOIP2016)那道题喜欢它。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值