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、 […

【生物信息学】层次聚类过程

文章目录 一、理论二、实践过程1过程2 一、理论 层次聚类是一种基于树状结构的聚类方法&#xff0c;它试图通过在不同层次上逐步合并或分裂数据集来构建聚类结构。这个树状结构通常被称为“树状图”&#xff08;dendrogram&#xff09;&#xff0c;其中每个节点代表一个数据点或…

cfa一级考生复习经验分享系列(六)

本人背景&#xff1a;本科经济学&#xff0c;有一定基础。现为某国企员工&#xff0c;每天大概率加班到7点多&#xff0c;复习时间有限。 准备材料 买了JC的网课&#xff08;主要复习依据&#xff09;&#xff0c;然后下载一个potplayer视频播放器&#xff08;神器&#xff0c;…

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 版…

硬件工程师桥——互动篇笔记

知识体系 无论是做硬件还是软件&#xff0c;都最好看看基础篇&#xff0c;软件到了一定程度&#xff0c;如果硬件懂一些才会走的更远基础篇的电路不建议在实际中使用基础篇建议从头到尾都看&#xff0c;前后都有关联提高篇讲EMC和高速电路的东西&#xff0c;属于硬件工程师进阶…

python异常之try/else分句

1 python异常之try/else分句 如果try语句代码块未发生异常&#xff0c;则执行else语句代码块&#xff0c;else需要放在except分句后面。 1.1 基本用法 用法 try:# try语句代码块# 执行时可能发生异常的代码块 except ExceptionType:# except语句代码块# 当发生指定类型的异…

利用淘宝获得商品详情 API:提升电商平台的用户体验

一、引言 随着电子商务的快速发展&#xff0c;电商平台之间的竞争日益激烈。为了在竞争中脱颖而出&#xff0c;电商平台需要不断提升用户体验&#xff0c;提高用户满意度和忠诚度。淘宝获得商品详情 API 的出现&#xff0c;为电商平台提供了一个重要的工具&#xff0c;可以帮助…

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;特斯拉涨近…

机器人运动速度与接触力

当机器人以较快的速度移动时&#xff0c;其与周围环境的接触力可能会增加。这是因为机器人快速移动时&#xff0c;其与环境的相互作用时间较短&#xff0c;导致接触力的瞬间增大。 然而&#xff0c;具体的接触力大小还受到其他因素的影响&#xff0c;如机器人的负载、环境条件…