当前位置: 首页 > article >正文

算法日记19:SC71多元最短路(Floyd)

一、题目:

在这里插入图片描述

二、题解:

1、我们一眼就可以看出这是一道多源最短路的题目,因此直接套用Floyd模板即可

2、Floyd原理解析

2.1:假设现在我们有这样一个图,要求我们求任意两个顶点的距离

在这里插入图片描述

2.2:对于这个样例,我们使用Floyd来做的步骤如下:(顺序不能改变!!)

在这里插入图片描述

  • 其中,我们并不关心两个点之间是怎么连接的,仅仅只是枚举所有情况,查看是否有其他情况使得两个点之间的路径更小
    在这里插入图片描述

2.3:也就是意味着我们要使用 O O O(n3)的时间复杂度,因此点/边的数量级一般<1e3

我们并不证明公式的正确性,背下模板即可

三、完整代码如下:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=307;
ll dis[N][N];  //表示从i-->j的距离

void solve()
{
    ll n,m,q;cin>>n>>m>>q;
    memset(dis,0x3f,sizeof(dis));

    for(int i=1;i<=m;i++)
    {
        ll ui,vi,wi;cin>>ui>>vi>>wi;
        dis[ui][vi]=min(dis[ui][vi],wi);    //对重边/自环的处理
    }
    //初始化
    for(int i=1;i<=n;i++) dis[i][i]=0;

    for(int k=1;k<=n;k++)//中转点
        for(int i=1;i<=n;i++)   //起始点
            for(int j=1;j<=n;j++)   //指向点
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

    while(q--)  //q次询问
    {
        ll ui,vi;cin>>ui>>vi;
        if(dis[ui][vi]>=4e18)   cout<<-1<<'\n';
        else cout<<dis[ui][vi]<<'\n';
    }
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int _=1;
    while(_--)solve();
    return 0;
}

http://www.kler.cn/a/549003.html

相关文章:

  • 【从0做项目】Java搜索引擎(4)——性能优化~烧脑~~~
  • MyBatis:动态SQL高级标签使用方法指南
  • 数据库基本概念及基本使用
  • 【一文读懂】HTTP与Websocket协议
  • Python 2 和 Python 3 在字符串编码上的差异
  • 人工智障的软件开发-自动流水线CI/CD篇-docker+jenkins部署之道
  • FPGA开发进阶指南:从基础到精通的技术跃迁
  • AI大模型的文本流如何持续吐到前端,实时通信的技术 SSE(Server-Sent Events) 认知
  • 【计算机网络】数据链路层数据帧(Frame)格式
  • 对项目交接的一些思考
  • 【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?
  • matlab汽车动力学半车垂向振动模型
  • 服务器部署DeepSeek,通过Ollama+open-webui部署
  • 轮子项目--消息队列的实现(4)
  • Spring AOP源码解析
  • 传统数组 vs vector和list
  • rust学习笔记1-window安装开发环境
  • 总部年会天府感怀
  • 数据结构 红黑树和set/map
  • docker部署笔记软件memos,通过5320端口访问,如何通过nginx反向代理配置访问?