AcWing854. Floyd求最短路

news2024/9/19 22:26:10

在这里插入图片描述

注意:Floyd是求图里面任意两个点x,y之间的最短距离

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 210, INF = 1e9;

int n, m, Q;
int d[N][N];

void floyd()
{
//枚举1~k个中间节点,尝试通过这几个点中转来达到更短距离
    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= n; j ++ )
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

int main()
{
    scanf("%d%d%d", &n, &m, &Q);

    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
            if (i == j) d[i][j] = 0;//自己到自己是0距离
            else d[i][j] = INF;//

    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        //min是因为处理重边,c是权重
        d[a][b] = min(d[a][b], c);
    }

    floyd();

    while (Q -- )
    {
        int a, b;
        scanf("%d%d", &a, &b);

        int t = d[a][b];
        //如果存在负权环,会走该分支,会一直减小总路径
        //或者真的是不可达也会走该分支
        if (t > INF / 2) puts("impossible");
        //可达的情况
        else printf("%d\n", t);
    }

    return 0;
}


扩展内容:

迪杰斯特拉和弗洛伊德算法区别:

迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd-Warshall)算法都是图论中用于求解最短路径问题的著名算法,但它们在设计、应用场景和效率上有所不同:

  1. 算法设计

    • 迪杰斯特拉算法:是一种贪心算法,用于在加权图中找到单个源点到所有其他顶点的最短路径。它适用于没有负权边的图。
    • 弗洛伊德算法:是一种动态规划算法,用于在加权图中找到所有顶点对之间的最短路径。它可以处理包含负权边的图,但不能处理负权环。
  2. 应用场景

    • 迪杰斯特拉算法:适用于单源最短路径问题,例如从某个城市到其他所有城市的最短路线。
    • 弗洛伊德算法:适用于全局最短路径问题,例如在所有城市之间找到最短的路线。
  3. 效率

    • 迪杰斯特拉算法:时间复杂度为 O ( V 2 ) O(V^2) O(V2)(使用简单的数组实现)或 O ( ( V + E ) log ⁡ V ) O((V+E) \log V) O((V+E)logV)(使用优先队列实现),其中 V V V 是顶点数, E E E 是边数。
    • 弗洛伊德算法:时间复杂度为 O ( V 3 ) O(V^3) O(V3),其中 V V V 是顶点数。对于大型图,这可能比迪杰斯特拉算法慢。
  4. 处理负权边

    • 迪杰斯特拉算法:不能正确处理包含负权边的图,因为负权边可能导致算法无法正确更新最短路径。
    • 弗洛伊德算法:可以处理负权边,但必须确保图中没有负权环,否则算法无法找到正确的最短路径。
  5. 数据结构

    • 迪杰斯特拉算法:通常使用优先队列(如最小堆)来选择下一个最近的顶点。
    • 弗洛伊德算法:通常使用二维数组来存储所有顶点对之间的最短路径信息。
  6. 初始化

    • 迪杰斯特拉算法:需要初始化源点到所有其他顶点的距离,源点到自己的距离为0,到其他顶点的距离为无穷大。
    • 弗洛伊德算法:需要初始化一个 V × V V \times V V×V 的距离矩阵,其中对角线元素为0,其他元素为边的权重或无穷大(如果顶点间没有直接的边)。

总结来说,选择哪种算法取决于具体问题的需求,如果需要找到单个源点到所有其他顶点的最短路径,且图中没有负权边,迪杰斯特拉算法是更好的选择。如果需要找到所有顶点对之间的最短路径,或者图中可能存在负权边,弗洛伊德算法可能更适合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

书生.浦江大模型实战训练营——(十三)茴香豆:企业级知识库问答工具

最近在学习书生.浦江大模型实战训练营&#xff0c;所有课程都免费&#xff0c;以关卡的形式学习&#xff0c;也比较有意思&#xff0c;提供免费的算力实战&#xff0c;真的很不错&#xff08;无广&#xff09;&#xff01;欢迎大家一起学习&#xff0c;打开LLM探索大门&#xf…

国货之光|暴雨信创服务器亮相北京科博会

8月13-16日&#xff0c;由北京市人民政府主办的第二十六届中国北京国际科技产业博览会&#xff08;简称北京科博会&#xff09;在北京国际会议中心成功举办。作为汇聚全球科技创新成果与智慧交流的高端盛会&#xff0c;北京科博会是推动创新发展成果展示的重要舞台。 青海科技展…

html2canvas ios慎用和createImageBitmap ios慎用

好好好&#xff0c;排查几天&#xff0c;原来是你 小本本记下了[翻白眼][翻白眼][翻白眼] ​html2canvas ios慎用&#xff0c;用了记得设置字体 ​2. createImageBitmap ios慎用&#xff0c;14及以下不兼容&#xff0c;建议更换api

Vue3基础2

1.Hooks 就是进行数据的封装&#xff0c;同一种类型的 数据 方法 计算属性 &#xff0c;放在一起 命名规范 use功能名称.ts 或.js 创建一个文件夹 hooks 1.useDog.ts import { reactive,onMounted } from "vue"; import axios from "axios";export def…

Golang | Leetcode Golang题解之第375题猜数字大小II

题目&#xff1a; 题解&#xff1a; func getMoneyAmount(n int) int {f : make([][]int, n1)for i : range f {f[i] make([]int, n1)}for i : n - 1; i > 1; i-- {for j : i 1; j < n; j {f[i][j] j f[i][j-1]for k : i; k < j; k {cost : k max(f[i][k-1], f[…

Linux命令:创建新的目录的工具mkdir命令详解

目录 一、概述 二、语法 1、基本语法 2、常用选项 3、获取帮助 三、示例 1. 创建单个目录 2. 创建多个目录 3. 使用 -p 选项创建多级目录 4. 设置目录权限 5. 显示创建目录的信息 &#xff08;1&#xff09;一般目录创建 &#xff08;2&#xff09;复杂目录创建 …

大数据技术之Flume 企业开发案例——负载均衡和故障转移(6)

目录 负载均衡和故障转移 1&#xff09;案例需求 2&#xff09;需求分析 3&#xff09;实现步骤 负载均衡和故障转移 1&#xff09;案例需求 使用 Flume1 监控一个端口&#xff0c;其 sink 组中的 sink 分别对接 Flume2 和 Flume3&#xff0c;采用 FailoverSinkProcessor…

裁员后的逆袭:程序员变外卖小哥,AI绘画成就全新职业生涯

一、初代程序员的困境 曾几何时&#xff0c;我是一名初代程序员&#xff0c;投身于互联网行业&#xff0c;为我国信息化建设贡献自己的力量。然而&#xff0c;随着年龄的增长和行业竞争的加剧&#xff0c;我不可避免地遭遇了裁员。面对突如其来的变故&#xff0c;我不得不重新审…

Nginx反向代理B

http协议反向代理 反向代理配置参数 proxy_pass; #用来设置将客户端请求转发给的后端服务器的主机 #可以是主机名(将转发至后端服务做为主机头首部)、IP地址&#xff1a;端口的方式 #也可以代理到预先设置的主机群组&#xff0c;需要模块ngx_http_upstream_module支持 #示例:…

机械学习—零基础学习日志(如何理解概率论9)

大数定律与中心定律 来看一道习题&#xff1a; 这个题目看看&#xff0c;应该是什么呢~下一章来看看解析~ 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP主&#xff09;

构造,CF 1290B - Irreducible Anagrams

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1290B - Irreducible Anagrams 二、解题报告 1、思路分析 首先根据样例特…

系统编程-消息队列

消息队列 目录 消息队列 引入 一、消息队列的特点 二、使用指令查看消息队列 三、使用消息队列进行通信的步骤 1、获取键值 2、创建或获取消息队列 id 3、使用消息队列进行数据的传输 4、msgrcv -- 从消息队列中读取数据 5、消息队列的多种操作函数 引入 -- 进程间…

一、undo log、Buffer Pool、WAL、redo log

目录 1、undo log2、Buffer Pool3、WAL4、redo log5、总结6、问题 1、undo log undo log日志是一种用于撤销回退的逻辑日志&#xff0c;在事务未提交前会记录相反的操作到undo log&#xff0c;当事务回滚&#xff0c;使用undo log 进行回滚&#xff0c;保证了事务的原子性。MV…

Golang 深入理解 GC

垃圾是指程序向堆栈申请的内存空间&#xff0c;随着程序的运行已经不再使用这些内存空间&#xff0c;这时如果不释放他们就会造成垃圾也就是内存泄漏。 垃圾回收 (Garbage Collection&#xff0c;GC) 是编程语言中提供的自动的内存管理机制&#xff0c;自动释放不需要的内存对象…

【Qt】Qt系统 | Qt事件 | 定时器

文章目录 定时器QTimerEventQTimer获取系统日期及时间 定时器 Qt 中在进行窗口程序的处理过程中&#xff0c;经常要周期性的执行某些动作&#xff0c;或者制作一些动画效果&#xff0c;使用定时器可以实现这些需求。 定时器&#xff0c;会在间隔一定时间后&#xff0c;执行某一…

八岁编程小天才:45分钟挑战AI极限,聊天机器人一鸣惊人

一位8岁的小女孩&#xff0c;用短短45分钟就搭建出了一个聊天机器人&#xff0c;吸引了180万人的在线围观。 Cursor&#xff0c;这款被Cloudflare副总裁家8岁女儿青睐的AI代码编辑器&#xff0c;成为全网热议的焦点。 甚至许多网友出来发话力挺。 AI编程&#xff0c;从复杂到简…

swagger,Knife4j和Yapi

目录 swagger swagger的作用 swagger的使用 一.导入依赖 二.创建swagger配置类&#xff0c;交给SpringIoC容器管理 三.使用swagger依赖的注解来给接口层(controller)的各种方法进行注释 Api ApiOperation ApiImplicitParam ApiModel ApiModelProperty 四&#xff1a;…

【layUI】点击导出按钮,导出excel文件

要实现的功能如下&#xff1a;根据执行状态判断是否可以导出。如果可以导出&#xff0c;点击导出&#xff0c;在浏览器里下载对应的文件。 代码实现 html里&#xff1a; <table class"layui-hide" id"studentTable" lay-filter"studentTable&…

vue2表单校验:添加自定义el-form表单校验规则

前言 在vue2表单校验&#xff1a;el-form表单绑定数组并使用rules进行校验_vue2 rules校验-CSDN博客中&#xff0c;使用form原生的rules对表单中每个控件的必填、格式等做了校验。但是保存时&#xff0c;除了验证每一个控件的输入合乎要求外&#xff0c;还需要验证控件之间的数…

八、DMA直接存储器存取

1、DMA简介 DMA是一个数据转运小助手&#xff0c;用来协助CPU完成转运的工作 2、存储器映像 计算机系统的5大组成部分&#xff1a;运算器、控制器、存储器、输入设备、输出设备 运算器和控制器&#xff0c;合称CPU 计算机的核心关键部分是CPU和存储器 存储器涉及&#xff…