Floyd求最短路(Floyd算法)

参考:约会怎么走到目的地最近呢?一文讲清所有最短路算法问题-CSDN博客

有4个城市8条路,公路上的数字表示这条公路的长短,并且路是单向的,现在要求我们求出任意两个城市之间的最短路程,也就是求任意两个点之间的最短路经,这就是多源最短路问题

1.假设我们只允许经过1号城市,求任意两城市之间的最短路程,应该如何求呢?

只需判断e[ i ][1]+e[1][ j ]是否比e[ i ][ j ]要小即可。

for(int i=1;i<=n;++i)   //遍历起点城市for(int j=1;j<=n;++j) //遍历被缩小距离的城市if(e[i][j] > e[i][1]+e[1][j]) //如果我通过1城市进行中转后的距离比你现在直接到要近e[i][j]=e[i][1]+e[1][j];//则直接赋值给给e[i][j]即可

2.假设我们允许经过1号城市和2号城市,求任意两点之间的最短路程,应该如何求呢?

我们需要在只允许经过 1号顶点时任意两点的最短路程的结果下,再判断如果经过2号顶点是否可以使得 i 号顶点到 j 号顶点之间的路程变得更短,即判断e[ i ][2]+e[2][ j ] 是否要比 e[ i ][ j ] 要小。
 

//经过一号顶点
for(int i=1;i<=n;++i)//遍历起点城市for(int j=1;j<=n;++j)//遍历被缩小距离的城市if(e[i][j] > e[i][1]+e[1][j])//如果我通过1城市进行中转后的距离比你现在直接到要近e[i][j]=e[i][1]+e[1][j];//则直接赋值给给e[i][j]即可//经过二号顶点
for(int i=1;i<=n;++i)//遍历起点城市for(int j=1;j<=n;++j)//遍历被缩小距离的城市if(e[i][j] > e[i][2]+e[2][j])//如果我通过2城市进行中转后的距离比你现在直接到要近e[i][j]=e[i][2]+e[2][j];//则直接赋值给给e[i][j]即可

 以此类推,如果我们允许经过从1号到n号所有城市求两点间最短路程,可以写出代码:

for(int k=1;k<=n;k++) //一共有n个城市{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]);  //经过k号城市进行中转的距离与原来直接从起点到终点的距离是否有缩小}}}

这也就是Floyd算法了,Floyd属于多源最短路径算法能够求出任意2个顶点之间的最短路径,支持负权边。

题目描述

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。

再给定 k 个询问,每个询问包含两个整数 x 和 y,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出 impossible

数据保证图中不存在负权回路。

输入格式

第一行包含三个整数 n,m,k。

接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

接下来 k 行,每行包含两个整数 x,y,表示询问点 x 到点 y 的最短距离。

输出格式

共 k 行,每行输出一个整数,表示询问的结果,若询问两点间不存在路径,则输出 impossible

数据范围

1≤n≤200,
1≤k≤n^2
1≤m≤20000,
图中涉及边长绝对值均不超过 1000010000。

输入样例:
3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3
输出样例:
impossible
1

思路:就像上面一样,遍历所有点,求从起点经过中间的点中转后到终点的最短距离

for(int k=1;k<=n;k++) //一共有n个城市{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]);  //经过k号城市进行中转的距离与原来直接从起点到终点的距离是否有缩小}}}

示例代码:

// 这道题是多源点问题,有多个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]; //d[i][j]表示从i到j的最短路长度void floyd()
{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);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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot项目启动前,使用GUI做初始化配置页面并将Log4j2的日志实时显示在GUI上

Springboot项目启动前&#xff0c;使用GUI做初始化配置页面并将Log4j2的日志实时显示在GUI上 效果预览 Mac Os效果图 Windows 10 效果图 需求分析 做这样的一个功能并不适用于所有系统&#xff0c;主要用于交付给用户的产品&#xff0c;这样方便客户自行维护。传统的服务一般…

初冬天气变化大,长辈身上的这些小毛病千万不能轻视

心率、血氧、肺功能&#xff0c;甚至是一次次不起眼的咳嗽&#xff0c;背后都可能藏着健康问题。但是我们可以利用好手表上的健康检测功能&#xff0c;提前获知健康数据的变化&#xff0c;有的放矢&#xff0c;科学应对身体的不适&#xff0c;度过一个有准备的温暖冬天&#xf…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

前段时间忙于接口测试&#xff0c;也看了几款接口测试工具&#xff0c;简单从几个角度做了个比较&#xff0c;拿出来与诸位分享一下。本文从多个方面对接口测试的三款常用工具进行比较分析&#xff0c;以便于在特定的情况下选择最合适的工具&#xff0c;或者使用自己编写的工具…

55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!

本文小编为大家分享一款开源算法图解教程项目&#xff01;学习算法更加通俗易懂&#xff0c;生动有趣&#xff01;这本开源的算法书是hello-algo&#xff0c;中文就叫Hello算法。 简介 《Hello 算法》是一本开源免费、新手友好的数据结构与算法入门教程&#xff0c;支持 Jav…

CogVLM与CogAgent:开源视觉语言模型的新里程碑

引言 随着机器学习的快速发展&#xff0c;视觉语言模型&#xff08;VLM&#xff09;的研究取得了显著的进步。今天&#xff0c;我们很高兴介绍两款强大的开源视觉语言模型&#xff1a;CogVLM和CogAgent。这两款模型在图像理解和多轮对话等领域表现出色&#xff0c;为人工智能的…

你知道在MyBatis中传参的#{}和${}的区别吗???

首先我们先将其区别列举出来&#xff1a; 首先演示sql注入&#xff1a; 基于上两篇博客的准备工作&#xff0c;继续开发&#xff1a;MyBatis的删除、修改、插入操作&#xff01;&#xff01;&#xff01;-CSDN博客 #{}的使用 UserMapper.java: User testLogin(User user); U…

gets函数的简单介绍

gets函数原型&#xff1a; 函数返回类型为字符串的地址char* gets函数特点&#xff1a; 1: 接收换行符之前的所有字符&#xff0c;直到遇到\n或\0为止 所以有时运用scanf不能输入&#xff08;原因&#xff1a;scanf遇到空格停止&#xff0c;而gets函数遇到空格不停止&#x…

金三银四精选面试题系列

Java中有哪几种方式来创建线程执行任务&#xff1f; 1. 继承Thread类 public class ZhouyuThread extends Thread{public static void main(String[] args) {ZhouyuThread thread new ZhouyuThread();thread.start();}Overridepublic void run() {System.out.println("h…

如何选择数字化转型顾问

在进行数字化转型时&#xff0c;第一步也是最重要的一步是深刻了解你的业务需求&#xff0c;这一基本流程涉及对企业的目标、挑战和抱负进行全面分析。必须提出关键问题&#xff1a;你通过数字化转型寻求哪些具体结果?主要目标是优化运营效率、提升客户体验&#xff0c;还是使…

连接SSH报错 / 连接容器SSH

连接SSH报错 / 连接容器SSH 前言被控端主控端连接失败 前言 本文介绍如何通过SSH方式远程连接Linux被控端&#xff0c;并介绍如何解决连接失败问题。 此方法同样适用于SSH连接Docker容器。 被控端 被控端一般为Linux&#xff0c;默认已安装ssh&#xff0c;但需要手动安装ope…

嵌入式中串口输入

学习目标 掌握串口初始化流程掌握串口接收逻辑了解中断接收逻辑熟练掌握串口开发流程学习内容 需求 串口接收PC机发送的数据。 串口数据接收 串口初始化 static void USART_config() {uint32_t usartx_tx_rcu = RCU_GPIOA;uint32_t usartx_tx_port = GPIOA;uint32_t usartx…

使用终端启动若依ruoyi

使用终端启动若依ruoyi 01 找到ruoyi-ui文件夹 02 cmd界面两个指令 npm i 下载完成后出现这个界面即为成功 npm run dev 加载结束后出现端口号即可 03 默认账号密码 访问localhost8080可得以上界面默认账号是admin默认密码是damin123