Floyd之蓝桥公园

Floyd

Floyd算法是一种用于解决“所有点最短路径”问题的算法。这是一个动态规划算法,可以在任何包含向量和非负权重的图中使用。它的时间复杂度是O(n^3),其中n是图中的节点数。

首先,我们定义一个二维数组g[i][j]表示从ij的最短距离,初始时如果ij之间有直接的边,那么g[i][j]是这条边的权值,否则g[i][j]为无穷大。对于任意的ig[i][i]应当初始化为0。这就是我们的初始状态。

Floyd算法的关键思想是:对于每个顶点k,我们尝试使用这个顶点作为所有其他点对(i,j)的中间点。也就是说,我们检查对于所有的点对(i,j),是否通过顶点k可以找到一条从i到j的更短路径。如果可以,我们就更新g[i][j]的值。

具体的,算法的步骤如下:

  1. 我们首先选择一个顶点k。
  2. 然后,我们遍历所有的点对(i,j)。
  3. 对于每个点对(i,j),我们计算通过顶点k的路径的长度,也就是g[i][k]+g[k][j]。
  4. 如果这个长度小于当前的g[i][j],那么我们就更新g[i][j]。也就是说,我们找到了一条从i到j的更短路径,那么我们就用这个更短的距离替换原来的g[i][j]。

这个过程会重复n次,其中n是顶点的数量。每次迭代,我们都选择一个新的顶点k,并尝试使用这个顶点更新所有的最短路径。因此,算法的时间复杂度是O(n^3)

最后,当算法结束时,g[i][j]就是从顶点i到顶点j的最短路径的长度。

例如假设我们有以下的图:

1 - 2
|   |
4 - 3

其中,节点1到节点2的距离是1,节点2到节点3的距离是2,节点3到节点4的距离是1,节点4到节点1的距离是2。节点1到3、2到4的距离都是无穷大。

在运行Floyd算法后,我们会得到以下结果:

  • 从顶点 1 到其他所有顶点的最短路径长度为:到自身是 0,到 2 是 1,到 3 是 3,到 4 是 2。
  • 从顶点 2 到其他所有顶点的最短路径长度为:到自身是 0,到 1 是 1,到 3 是 2,到 4 是 3。
  • 从顶点 3 到其他所有顶点的最短路径长度为:到自身是 0,到 2 是 2,到 1 是 3,到 4 是 1。
  • 从顶点 4 到其他所有顶点的最短路径长度为:到自身是 0,到 3 是 1,到 2 是 3,到 1 是 2。

这就是Floyd算法的主要思想和实现。通过这个算法,我们可以计算出图中任意两点之间的最短路径。

注意,Floyd算法不仅可以用于求解最短路径问题,还可以用于解决其他相关问题。比如,如果我们想要知道是否存在负权环(这在某些问题是非法的),我们只需在算法结束后检查对角线上是否存在负数。如果存在那么图中就存在负权环。

此外,Floyd算法还可以求解图的传递闭包问题。所谓传递闭包,就是对于图中的每个点对(i,j),如果从i可以到达j,则g[i][j]=1,否则g[i][j]=0。此时,我们只需将Floyd算法中的 min 操作改为 or 操作,操作改为 and 操作,就可以求解传递闭包问题了。

总的来说,Floyd算法是一种非常强大的算法,可以解决许多与图和网络相关的问题。虽然它的时间复杂度较高,但是对于顶点数量不是非常大的问题,它的效率是可以接受的。特别是在蓝桥杯比赛中有奇效,由于蓝桥杯是OI赛制,即过部分数据得部分分,而又因为Floyd易记忆,代码短,使我们必须掌握的算法之一。

C++代码:

void floyd(){
	for(int k = 1; k <= n; k++)
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
				g[i][j] = min((g[i][k])+g[k][j],g[i][j]);
}

扩展阅读-原理

Floyd是基于动态规划的多源最短路的算法。

定义f[k][i][j]为经过前k个结点,从 i 到 j 的最短路径:

  • f[k][i][j]可以从f[k-1][i][j]转移过来,即不经过第k个节点。
  • 也可以从f[k-1][i][k] +f[k-1][k][j]转移过来,即经过第k个节点。

综上,转移方程为f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j])。我们观察上述转移方程,在更新f[k]层状态的时候,只用到了f[k-1]层的值,f[k-2]及之前的层的值都用不上了。可以用滚动数组进行优化,最终方程为f[i][j]=min(f[i][j],f[i][k]+f[k][j])

蓝桥公园

题目描述

小明喜欢观景,于是今天他来到了蓝桥公园。已知公园有N个景点,景点和景点之间一共有M条道路。小明有Q个观景计划,每个计划包含一个起点st和一个终点ed,表示他想从st去到ed。但是小明的体力有限,对于每个计划他想走最少的路完成,你可以帮帮他嘛?

输入描述

输入第一行包含三个正整数N, M, Q

第2到M+1行每行包含三个正整数u,v,w,表示u↔v之间存在一条距离为w的路。

第M+2到M+Q-1行每行包含两个正整数st,ed,其含义为计划起点和终点。

1\leq N\leq 400,1\leq M\leq\frac{N\times (N-1)}{2},Q\leq 10^3,1\leq u,v,st,ed\leq N,1\leq w\leq 10^9

输出描述

输出共Q行,对应输入数据中的查询(任意两点最短路)。若无法从st到达ed则输出-1。

输入输出样例

输入

3 3 3
1 2 1
1 3 5
2 3 2
1 2
1 3
2 3

输出

1
3
2

运行限制

语言最大运行时间最大运行内存
C++1s128M
C1s128M
Python33s128M
Java2s128M

代码

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

using namespace std;
const int N = 4e2+10;
typedef long long LL;
int n, m, q;
LL g[N][N];

void floyd(){
	for(int k = 1; k <= n; k++)
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
				g[i][j] = min(g[i][k]+g[k][j], g[i][j]);
}

int main(){
	cin >> n >> m >> q;
	memset(g, 0x3f, sizeof g);
	
	while(m--){
		LL a, b, c;
		cin >> a >> b >> c;
		g[a][b] = g[b][a] = min(g[a][b], c);
	}
	
	//初始化自身0
	for(int i = 1; i <=n; i++)
		g[i][i] = 0;
		
	floyd();
	
	while(q--){
		int st, ed;
		cin >> st >> ed;
		cout << (g[st][ed]==0x3f3f3f3f3f3f3f3f?-1:g[st][ed])<<endl;
	}

	return 0;
}

总结

Floyd算法用来求解任意两点间的最短路。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软著说明文档生成/辅助填写工具

软著说明文档生成/辅助填写工具&#xff0c;自行申请软著的话&#xff0c;软著60页源码还比较容易搞定&#xff0c;但是说明文档有格式和字数要求&#xff0c;就很烦。这个网站可以进行格式和内容的辅助填写&#xff0c;不用再把精力浪费到没用的调整格式上&#xff0c;网站地址…

揭秘SCQL:隐私计算的未来之路

1.SCQL使用/集成最佳实践 隐语隐私计算中SCQL&#xff08;Secure Collaborative Query Language&#xff09;的设计旨在提供一种便捷且安全的方式来处理多方参与下的隐私敏感数据查询与分析&#xff0c;而无需暴露原始数据给任何一方。以下是基于以上所记录信息的SCQL使用和集…

Jackson @JsonUnwrapped注解扁平化 序列化反序列化数据

参考资料 Jackson 2.x 系列【7】注解大全篇三JsonUnwrapped 以扁平的数据结构序列化/反序列化属性Jackson扁平化处理对象 目录 一. 前期准备1.1 前端1.2 实体类1.3 Controller层 二. 扁平化序列反序列化数据2.1 序列化数据2.2 反序列化数据 三. 前缀后缀处理属性同名四. Map数…

Pillow教程10:设计博文的文字背景封面图,再也不担心找不到不素材了

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

C#中ref和out相关知识点

知识点一&#xff1a; 知识点二&#xff1a; 知识点三&#xff1a; 测试&#xff1a; 总结&#xff1a; 练习

逐步学习Go-WaitGroup【连字都懒得写了,直接Show my Code】

package waitgroup_testimport ("fmt""runtime""sync""testing""time""github.com/stretchr/testify/assert" )// 这是对Go语标准库中sync包下的WaitGroup的描述。// WaitGroup用于等待一组并发的goroutine结结束…

理解VAE,可视化

引言 本文主要摘抄自&#xff1a;Understanding Variational Autoencoders (VAEs), Joseph Rocca, Sep 24, 2019&#xff0c;同时会加一些自己的理解和对原文的解释。 关于数据生成&#xff0c;目前深度生成模型中主流的有&#xff1a; 生成对抗网络——GANs&#xff0c;这是…

【Python的第三方库】flask

1. Flask是什么&#xff1f; 基于python的web后端开发轻量级框架&#xff1b; 基于MVT设计模式即Models,Views,Templates(html模板语言) 2.中文文档&#xff1a; https://dormousehole.readthedocs.io/en/2.1.2/index.html 3.依赖3个库&#xff1a; Jinja2 模版&#xff1…

armlinux-外部中断

s3c2440的中断框图 如果我们单纯配置一个按键的外部中断&#xff0c;就不存在子中断与优先级的问题。 由于是按键的外部中断&#xff0c;通过引脚的高低电平来触发。所以我们要先配置引脚的功能。 我们使用按键1&#xff0c;终端源为EINT8&#xff0c;对应引脚GPG0 通过用户手…

物联网实战--入门篇之(八)嵌入式-空气净化器

目录 一、风扇调速 二、通讯协议 三、净化器运行逻辑 一、风扇调速 单片机是不能直接驱动电机的&#xff0c;因为主芯片的驱动电流比较小(50mA左右)&#xff0c;他们之间正常还要有个电机驱动器&#xff0c;常用的有TB6612、L298和L9110等&#xff0c;目前项目用的这个电机它…

全国航空机场分布矢量数据/旅游景点poi/全国港口码头分布/地铁站分布/火车站分布/POI矢量数据

民用航空机场是指针对包括跑道型机场、表面直升机场、高架直升机场、船上直升机场、直升机水上平台、滑翔机场、水上机场、有人操纵气球施放场以及其他专供民用航空器起降的划定区域。民用航空机场分为通用航空机场和公共运输机场&#xff1b;不包括临时机场和专用机场。 根据中…

谷歌修复了安卓中的 28 个漏洞和 Pixel 设备中的 25 个错误

关注公众号&#xff1a; 网络研究观 获取更多信息 本周&#xff0c;谷歌工程师修复了Android 中的 28 个漏洞和 Pixel 设备中的 25 个错误&#xff0c;其中包括两个已经被利用的问题。 据报道&#xff0c;网络取证已利用 Google Pixel 0day 漏洞在没有 PIN 码的情况下解锁智能…

【附下载】2024全行业数字化转型企业建设解决方案PPT合集

精品推荐&#xff0c;2024全行业数字化转型企业建设解决方案PPT合集&#xff0c;精品PPT源格式共21份。 以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 1.制造业数字化转型解决方案及应用.pptx 2.医院数字化网络解决方案.pptx 3.食品饮料工厂数字…

Vuex(vue 项目中实现 频繁、大范围数据共享的技术方案)

参考文档(点击查看) 好处 1.数据的存取一步到位&#xff0c;不需层层传递 2.数据的流动非常清晰 3.存储在Vuex中的数据都是响应式的&#xff08;数据更新后&#xff0c;使用数据的组件都会自动更新&#xff09; Vuex基础配置 npm i vuex3.6.2state中用来存储数据&#xff0c…

js中使let关键字报错,改用var关键字解决

js中使let关键字报错,改用var关键字解决 项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;总结 项目场景&#xff1a; 使用 let 关键字报错&#xff0c;报错信息为&#xff1a; Uncaught ReferenceError: maxNum is not defined at getMaxNum (4-3.htm…

专题三——二分算法

目录 原理 模板 朴素二分算法 非朴素二分算法 一二分查找 二在排序数组中查找元素的第一个和最后一个位置 三点名 四x的平方根 五搜索插入位置 六山脉数组的峰顶索引 七寻找峰值 八寻找旋转排序数组中的最小值 原理 定义两个指针&#xff1a;left指向数组第一个元…

Layui三级联动插件使用方法

Layui高版本中没有在提供三级联动这个动画了&#xff0c;而是封装成了一个插件&#xff0c;使用方式也很简单 官网 省市县区三级联动下拉选择器 layarea - Layui 第三方扩展组件平台 (layuion.com)https://dev.layuion.com/extend/layarea/#doc html页面约束 整个选择器需要…

【保姆级讲解如何安装与配置Node.js】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

HTML1:html基础

HTML 冯诺依曼体系结构 运算器 控制器 存储器 输入设备 输出设备 c/s(client客户端) 客户端架构软件 需要安装,更新麻烦,不跨平台 b/s(browser浏览器) 网页架构软件 无需安装,无需更新,可跨平台 浏览器 浏览器内核: 处理浏览器得到的各种资源 网页: 结构 HTML(超…

SRS 实时视频服务器搭建及使用

一、SRS 介绍 SRS是一个开源的&#xff08;MIT协议&#xff09;简单高效的实时视频服务器&#xff0c;支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等协议。 SRS媒体服务器和FFmpeg、OBS、VLC、 WebRTC等客户端配合使用&#xff0c;提供流的接收和分发的能力&am…