最短路(1)——Floyd算法//洛谷2910

第一行国际惯例——咕咕咕。

1.floyd算法原理是动态规划
2.时间复杂度是O(n^3)(n是点的个数
3.适用于点比较少的情况
4.适用于多源最短路(跑完floyd后直接输出数组即可得到从x到y的最短路
5.算法核心是利用两点之间的其他点来中转,从而更新最短路。

本代码以洛谷2910为例
与普通模板不同的是,2910多了一个规定路径,只需累加即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#define maxn 1005
#define inf 0x3f3f3f3f

using namespace std;

int p[maxn][maxn];//用于存储每两个点之间的距离
int n,m;

void init()
{
    for(int i=0; i<maxn; ++i)
        for(int j=0; j<maxn; ++j)
        {
            p[i][j]=inf;
        }
}//初始化为inf
void floyd()
{
    for(int k=1; k<=n; ++k)
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=n; ++j)
            {
                if(p[i][k]+p[k][j]<p[i][j])
                    p[i][j]=p[i][k]+p[k][j];
            }//求ij之间的最短路
}//n个点

int main()
{
    init();
    int a[100005];
    scanf("%d%d",&n,&m);//有n个点m条边
    for(int i=0; i<m; ++i)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=n; ++j)
        {
            int x;
            scanf("%d",&x);
            if(i==j)
                continue;
            p[i][j]=x;
        }
    }//用p来存每两个点直接距离
    floyd();
    int sum=0;
    for(int i=1; i<m; ++i)
    {
        sum+=p[a[i-1]][a[i]];
    }
    cout<<sum<<'\n';
    return 0;
}

附一个练习题SDNU1224
注意输入双向路径。感谢syh同学一语道破?
再附一个练习题洛谷P1119
这题思路是按时间每次更新x到y的最短路,若无法更新,即res为inf时返回-1。同时因为保证了t是不下降的,所以之前使用过的中转点就不再更新了(用一个访问标记即可),不然会超时。
再附一个洛谷P3905
其实最短路用啥写不行啊,毕竟数据范围合适不超时就行呗(所以我奔着spfa去的用了floyd)。这题很巧妙的是,求需要重建的路的长度,所以可以用有路没破坏的是0,有路被破坏的是权值,没路是inf,求最短路即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值