图结构_最短路_Floyd算法模板

适用范围:求一个边有权值的有向联通图,求点i,到点j的最短路或最长路


复杂度:空间复杂度n^2,时间复杂度o(n^3)


算法概述:

我如果要从点i到点j那么我可以选择以下几种方式

从i直接到j

从i,经过点1,然后到j

从i,经过点2,然后到j

.........

Floyd算法就是遍历中间经过的点并取最值

他可能经过点1,点1,3 ,4,很多种情况先记住这东西,看后面的代码室就会知道我是怎么用o(n^3)来解决这个问题的


初始化:直接输入这个图和边即可,从点i,到点j的边的权值用map[i][j]表示即可


代码模板:

void Floyd(int n,double map[maxn][maxn])//n为点的个数
{
    for (int k=1;k<=n;k++)//遍历中间节点
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
    if (map[i][k]+map[k][j]<map[i][j])
        map[i][j]=map[i][k]+map[k][j];
    return;
}
之后的map[i][j]就是i到j的最短路了


解释:当我中间节点遍历到第k个时,我已经求出了可以经过1到k-1这些点之后,从i到j的最短路;自己看代码体会一下这个过程


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值