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.mzph.cn/news/239296.shtml

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

相关文章

蓝桥杯2019年10月青少组Python程序设计省赛真题

1:有n个人围成一个圈,按顺序排好号然后从第一个人开始报数(从1到3报数),报到3的人退出圈子,然后继续从1到3报数,直到最后留下一个人游戏结束,问最后留下的是原来第几号输人描迹:输人一个正整数n 输出描迹:输出最后留下的是原来的第几号 [样例输人] [样例输出] 2: 3、 […

ACM32G1x3有那些优势?适用于那些产品上?

ACM32G1x3优势 • 320KB 程序Flash64KB SRAM&#xff0c;跑RTOS程序开发更加方便 • 从外挂Flash通过DMA搬运图片数据到PSRAM&#xff0c;无需打断程序运行 • 120MHz M33内核&#xff0c;处理性能佳 • 集成2路CAN接口&#xff0c;适合工控等需要CAN接口的场景 • QS…

[JS设计模式]Flyweight Pattern

Flyweight pattern 享元模式是一种结构化的设计模式&#xff0c;主要用于产生大量类似对象而内存又有限的场景。享元模式能节省内存。 假设一个国际化特大城市SZ&#xff1b;它有5个区&#xff0c;分别为nanshan、futian、luohu、baoan、longgang&#xff1b;每个区都有多个图…

代码随想录刷题题Day20

刷题的第二十天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day20 任务 ● 理论基础 ● 77. 组合 1 回溯算法理论基础 1.1 回溯法 回溯法是一种搜索的方式&#xff0c;是递归的副产品&#x…

海外媒体发稿:雅虎全球发稿推广脱颖而出的10种方法-华媒舍

雅虎全球发稿是一项重要的推广手段&#xff0c;能够帮助企业和个人提升品牌知名度和曝光率。在众多的发稿中脱颖而出并不容易。本文将为您介绍10种让您的雅虎全球发稿在众多文章中脱颖而出的方法&#xff0c;帮助您取得更好的效果。 1. 深入研究目标受众 在撰写雅虎全球发稿前…

Python to_numeric函数参数解读与最佳实践!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python中的to_numeric函数是pandas库提供的一个强大而灵活的工具&#xff0c;用于将数据转换为数字类型。本文将深入探讨to_numeric函数的各种参数和用法&#xff0c;通过丰富的示例代码帮助大家更全面地理解和运…

基于thinkphp+vue的大学生校园生活服务平台sb00r

大学生一体化服务平台可以提高大学生综合服务信息管理问题的解决效率&#xff0c;优化大学生综合服务信息处理流程&#xff0c;保证大学生综合服务信息数据的安全&#xff0c;它是一个非常可靠&#xff0c;非常安全的应用程序。 运行环境:phpstudy/wamp/xammp等 开发语言&#…

CAS机制

Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前&#xff0c;了解这个技术的底层原理是非常重要的&#xff0c;所以本篇文章就先来讲讲什么是CAS机制&#xff0c;CAS机制存在的一些问题以及在Java中怎么使…

鸿蒙应用开发初体验 HelloWorld

9 月 25 日&#xff0c;华为常务董事、终端 BG CEO、智能汽车解决方案 BU 董事长余承东华为秋季全场景新品发布会上介绍了鸿蒙系统的最新进展&#xff1a;HarmonyOS 4 发布后&#xff0c;短短一个多月升级用户已经超过 6000 万&#xff0c;成为史上升级速度最快的 HarmonyOS 版…

WebGL开发三维解剖学应用

开发基于 WebGL 的三维解剖学应用通常涉及以下步骤。这些步骤包括创建三维模型、整合交互性、优化性能等&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.三维模型创建&#xff1a; 首先&#xff0…

智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白冠鸡算法4.实验参数设定5.算法结果6.参考文…

vue proxy代理 和 Nginx 配置跨域

vue.config.js文件中配置的代理&#xff1a; devServer: {port: 9095,// open: true, // 配置项目在启动时自动在浏览器打开proxy: {/yh: { // /api是代理标识&#xff0c;一般是每个接口前的相同部分target: "http://192.168.5.58:8002", // 请求地址&#xff0c;一…

4.3【共享源】克隆实战开发之截屏(一)

一,Screen截屏介绍 Screen的截屏是指从源读取像素,然后复制到缓冲区。然后可以根据需要操纵缓冲区;它可以简单地写入文件,也可以在其他窗口或显示器中使用。 Screen API从源中读取像素,并将其复制到提供的缓冲区中以捕获截屏。缓冲区可以是pixmap或窗口缓冲区,但必须设…

众和策略:美股全线上涨 中概股大涨

当地时间12月21日&#xff0c;欧洲股市全线下跌&#xff0c;英国富时100指数、法国CAC40指数、德国DAX指数均小幅下跌。美国通胀降温&#xff0c;美股商场三大指数尾盘飙升&#xff0c;纳斯达克指数、标普500指数均涨逾1%&#xff0c;大型科技股多数上涨&#xff0c;特斯拉涨近…

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

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

React + valtio 响应式状态管理

Valtio 是一个很轻量级的响应式状态管理库。valtio 让数据管理在 React 和原生 JS (Vanilla) 中变得更加简单的一个库&#xff0c;它类似于 Vue 的数据驱动视图的理念&#xff0c;使用外部状态代理去驱动 React 视图来更新。 一、状态管理库 dispatch 流派(单向数据流-中心化管…

Flink 运行时[Runtime] 整体架构

一、基本组件栈 在Flink整个软件架构体系中&#xff0c;同样遵循着分层的架构设计理念&#xff0c;在降低系统耦合度的同时&#xff0c;也为上层用户构建Flink应用提供了丰富且友好的接口。从下图中可以看出整个Flink的架构体系基本上可以分为三层&#xff0c;由上往下依次是 …

MT6739/MTK6739安卓核心板规格参数_MTK平台核心板定制

安卓核心板采用联发科 MT6739 平台开发设计&#xff0c;搭载开放的智能 Android 操作系统。它集成 GPU PowerVR GE8100 570MHz&#xff0c;集成了 BASEBAND、UMCP、PMU 等核心器件&#xff0c;支持 2.4G5G 双频 WIFI(可支持 1*1 MIMO)、BLUETOOTH 近距离无线传输技术&#xff0…

绩效面谈-大公司提高绩效的必杀技

绩效面谈是一种人力资源管理工具&#xff0c;旨在评估员工绩效并为其提供反馈。其意义包括&#xff1a; 为提高绩效制定具体的目标和计划。通过与员工讨论绩效表现&#xff0c;管理人员和员工可以确定明确的目标和方向&#xff0c;以实现更高的绩效水平。 帮助员工理解工作环…

【组合数学】Pólya 计数理论

目录 1. 引言2. 置换群3. Burnside 引理共轭类k 不动置换类Burnside 引理 4. Plya 计数定理4.1 对点着色问题4.2 对面着色问题4.3 重复球放盒子 1. 引言 Plya 计数理论是数学中的一个分支&#xff0c;主要研究的是对称性在组合计数问题中的应用。该理论以匈牙利数学家乔治波利…