当前位置: 首页 > news >正文

C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

一、弗洛伊德·沃肖尔算法

Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样,它计算图中的最短路径。然而,Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面,Floyd Warshall计算输入图中每对顶点之间的最短距离。

假设你有5个朋友:比利、珍娜、卡西、艾丽莎和哈里。你知道有几条路连接他们的一些房子,你知道这些路的长度。但是,弗洛伊德·沃沙尔可以利用你所知道的,并根据这些信息为你提供最佳路线。例如,看看下面的图表,它显示了从一个朋友到另一个朋友的路径以及相应的距离。

我们初始化解矩阵的第一步与输入图矩阵相同。然后,我们通过将所有顶点视为中间顶点来更新解矩阵。其思想是一个接一个地拾取所有顶点,并更新所有最短路径,其中包括拾取的顶点作为最短路径中的中间顶点。当我们选取顶点数 k 作为中间顶点时,我们已经考虑了顶点{0,1,2,..k-1}作为中间顶点。对于源顶点和目标顶点的每一对(I,j),都有两种可能的情况。 1) k 在从 I 到 j 的最短路径中不是中间顶点,我们保持 dist[i][j]的值不变。 2) k 是从 I 到 j 的最短路径中的中间顶点,我们将 dist[i][j]的值更新为 dist[I][k]+dist[k][j]if dist[I][j]>dist[I][k]+dist[k][j] 下图显示了以上全对最短路径问题中的最优子结构性质。

二、Floyd-Warshall算法的应用

1、最短距离

弗洛伊德·沃沙尔将告诉每对朋友之间的最佳距离。它将清楚地告诉您,从Alyssa的房子到Harry的房子的最快路径是连接边,其权重为1。但是,它也会告诉你,从比利家到珍娜家的最快方式是先经过卡西家,然后是艾丽莎家,然后是哈利家,最后才到珍娜家。这就是弗洛伊德·华肖的力量;无论你现在在哪所房子,它都会告诉你去其他房子的最快方式。

Floyd-Warshall算法是动态规划的一个例子。它将问题分解为较小的子问题,然后将这些子问题的答案结合起来,以解决较大的初始问题。想法是这样的:要么从A到C的最快路径是从A到C的最快路径,要么是从A到B的最快路径加上从B到C的最快路径。

Floyd Warshall在网络方面非常有用,类似于最短路径问题的解决方案。但是,它在管理路线上的多个站点时更有效,因为它可以计算所有相关节点之间的最短路径。事实上,Floyd Warshall的一次运行可以为您提供有关静态网络的所有信息,以优化大多数类型的路径。它在计算矩阵求逆时也很有用。

2、求解离散数学中传递闭包

离散数学中传递闭包怎么求?传递闭包的求法就是:通过反复求矩阵的幂,直到结果不在变化为止!可以选择用warshall法,不断的运行,直到MR[n][i],MR[i][n]都为1时使得MR[i][j]为1,不然的话还是要继续不断的运行,直到结果MR[n][i],MR[i][n]都为1时使得MR[i][j]为1就停止。

在这个式子中,a数组中为布尔数组,主要是用来描述两个节点是不是出于一个相连的地位上,可以看出做这样一个无权图的邻接矩阵,在算法过程中是和Floyd相当相似,而且三重循环的话是需要列出中间的每一个节点,不过对于传递闭包而言的话,只是需要求出两个节点是不是相连,并不用在进一步的求解两个线路中间的最短路径了。

传递闭包最为简单的技术就是选择采用弗洛伊德算法,选择用Floyd-Warshall算法能够最简便的解决任意两点之间最简单的路径中的一个算法,而且还可以这个却的出力有向图或者负权。

时间复杂度: O(V^3) 上面的程序只打印最短的距离。我们还可以通过将前置信息存储在单独的 2D 矩阵中来修改解决方案以打印最短路径。 同样,INF 的值可以从 limits.h 取为 INT_MAX,以确保我们处理最大可能值。当我们取 INF 为 INT_MAX 时,需要改变上述程序中的 if 条件,以避免算术溢出。

三、算法思路

1、算法所要解决的问题称为多源最短路径问题,算法完成后可求出任意两点之间的最短路径,所以既然他这么简单,那么这五行码有什么意义?

A和 B的直接距离是6,那么我们该如何缩小它们之间的距离?

其算法的具体思想如下:一想,我只经过 C这个点的中转就可以让

2、相邻矩阵 dist存储路径,而最终状态表示点的最短路径。若没有直接关联的点,默认值为一个非常大的值(不要溢出)!并且自身的长度是0。

将从1到 n点依次添加到图中。每一点都加入以测试是否有路径长度被改变。

并以图中每个点(i, j两次循环)为例,判断每个点对距离是否因所加入的点而变化最小。若有变化,则两点(i、 j)距离将改变。

非常简单,我们只需通过其它点的中转就可以了,这里我们就是 C点,可以让 A和 B之间的距离到达5,然后我再想一想,我只经过 C这个点的中转就可以让他们的距离变小,

为了确定这个周期的最外层循环被用于传递这个周期中的哪个点。即,第一次循环是以一号顶点为中转站,观察是否可以将其他点间的距离减小,第二个循环是在第一个循环的基础。

总结: warshall算法的时间复杂度为 O (n3),实现简单,适用于处理稠密图与顶点关。

四、实现代码

参考:

C#,图(Graph)的数据结构设计与源代码icon-default.png?t=O83Ahttps://blog.csdn.net/beijinghorn/article/details/125133711?spm=1001.2014.3001.5501

源代码(POWER BY TRUFFER):

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public partial class Graph{public int[,] Floyd_Warshall(){int V = Node_Number;int[,] dist = new int[V, V];for (int i = 0; i < V; i++){for (int j = 0; j < V; j++){dist[i, j] = Matrix[i, j];}}for (int k = 0; k < V; k++){for (int i = 0; i < V; i++){for (int j = 0; j < V; j++){if (dist[i, k] + dist[k, j] < dist[i, j]){dist[i, j] = dist[i, k] + dist[k, j];}}}}return dist;}}public static partial class GraphDrives{public static string Floyd_Warshall(){StringBuilder sb = new StringBuilder();int INF = 99999;int[,] m = { {  0,   5, INF,  10 },{INF,   0,   3, INF },{INF, INF,   0,   1 },{INF, INF, INF,   0 }};Graph g = new Graph(m);g.AdjacencyMatrix();int[,] dist = g.Floyd_Warshall();return Algorithm_Gallery.ToHtml(dist);}}
}

相关文章:

C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

一、弗洛伊德沃肖尔算法 Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样&#xff0c;它计算图中的最短路径。然而&#xff0c;Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面&#xff0c;Floy…...

AWS云计算概览(自用留存,整理中)

目录 一、云概念概览 &#xff08;1&#xff09;云计算简介 &#xff08;2&#xff09;云计算6大优势 &#xff08;3&#xff09;web服务 &#xff08;4&#xff09;AWS云采用框架&#xff08;AWS CAF&#xff09; 二、云经济学 & 账单 &#xff08;1&#xff09;定…...

1. npm 常用命令详解

npm 常用命令详解 npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于安装和管理 Node.js 应用中的依赖库。下面是 npm 的一些常用命令及其详细解释和示例代码。 镜像源 # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 …...

js:根据后端返回数据的最大值进行计算然后设置这个最大值为百分之百,其他的值除这个最大值

问&#xff1a; 现在tabData.value 接收到了后端返回的数据&#xff0c; [{text:人力,percentage&#xff1a;‘90’}&#xff0c;{text:物品,percentage&#xff1a;‘20’}&#xff0c;{text:物理,percentage&#xff1a;‘50’}&#xff0c;{text:服务,percentage&#xff…...

【Spring】@Size 无法拦截null的原因

问题复现 在构建 Web 服务时&#xff0c;我们一般都会对一个 HTTP 请求的 Body 内容进行校验&#xff0c;例如我们来看这样一个案例及对应代码。当开发一个学籍管理系统时&#xff0c;我们会提供了一个 API 接口去添加学生的相关信息&#xff0c;其对象定义参考下面的代码&…...

【Block总结】掩码窗口自注意力 (M-WSA)

摘要 论文链接&#xff1a;https://arxiv.org/pdf/2404.07846 论文标题&#xff1a;Transformer-Based Blind-Spot Network for Self-Supervised Image Denoising Masked Window-Based Self-Attention (M-WSA) 是一种新颖的自注意力机制&#xff0c;旨在解决传统自注意力方法在…...

用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效

这篇文章将带您深入解析使用 HTML5 Canvas 和 JavaScript 实现动态雪花特效的代码原理。 1,效果展示 该效果模拟了雪花从天而降的动态场景,具有以下特点: 雪花数量、大小、透明度和下落速度随机。雪花会在屏幕底部重置到顶部,形成循环效果。随窗口大小动态调整,始终覆盖…...

【cocos creator】【ts】事件派发系统

触发使用&#xff1a; EventTool.emit(“onClick”) 需要监听的地方&#xff0c;onload调用&#xff1a; EventTool.on(“onClick”, this.onClickEvent, this) /**事件派发*/class EventTool {protected static _instance: EventTool null;public static get Instance(): Eve…...

《探索鸿蒙Next上开发人工智能游戏应用的技术难点》

在科技飞速发展的当下&#xff0c;鸿蒙Next系统为应用开发带来了新的机遇与挑战&#xff0c;开发一款运行在鸿蒙Next上的人工智能游戏应用更是备受关注。以下是在开发过程中可能会遇到的一些技术难点&#xff1a; 鸿蒙Next系统适配性 多设备协同&#xff1a;鸿蒙Next的一大特色…...

CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)

目录 一、左边定宽 右边自适应 1.浮动 2.利用浮动margin 3.定位margin 4.flex布局 5.table 布局 二、左右成比自适应 1:1 1flex布局 table布局 1:2 flex布局 <div class"father"><div class"left">左边自适应</div><div class"r…...

acwing_3195_有趣的数

acwing_3195_有趣的数 // // Created by HUAWEI on 2024/11/17. // #include<iostream> #include<cstring> #include<algorithm>#define int long longusing namespace std;const int N 1000 50; const int MOD 1e9 7; int C[N][N]; //组合数signed mai…...

Liunx-搭建安装VSOMEIP环境教程 执行 运行VSOMEIP示例demo

本文安装环境为Liunx&#xff0c;搭建安装VSOMEIP环境并运行基础例子。 1. 安装基础环境 使用apt-get来安装基础环境&#xff0c;受网络影响可以分开多次安装。环境好的也可以一次性执行。 sudo apt-get install gcc g sudo apt-get install cmake sudo apt-get install lib…...

Git | git revert命令详解

关注&#xff1a;CodingTechWork 引言 Git 是一个强大的版本控制工具&#xff0c;广泛应用于现代软件开发中。它为开发人员提供了多种功能来管理代码、协作开发和版本控制。在 Git 中&#xff0c;有时我们需要撤销或回退某些提交&#xff0c;而git revert 是一个非常有用的命令…...

ASP.NET Core 中,Cookie 认证在集群环境下的应用

在 ASP.NET Core 中&#xff0c;Cookie 认证在集群环境下的应用通常会遇到一些挑战。主要的问题是 Cookie 存储在客户端的浏览器中&#xff0c;而认证信息&#xff08;比如 Session 或身份令牌&#xff09;通常是保存在 Cookie 中&#xff0c;多个应用实例需要共享这些 Cookie …...

Flyte工作流平台调研(五)——扩展集成

系列文章&#xff1a; Flyte工作流平台调研&#xff08;一&#xff09;——整体架构 Flyte工作流平台调研&#xff08;二&#xff09;——核心概念说明 Flyte工作流平台调研&#xff08;三&#xff09;——核心组件原理 Flyte工作流平台调研&#xff08;四&#xff09;——…...

【AUTOSAR 基础软件】软件组件的建立与使用(“代理”SWC)

基础软件往往需要建立一些“代理”SWC来完成一些驱动的抽象工作&#xff08;Complex_Device_Driver_Sw或者Ecu_Abstraction_Sw等&#xff09;&#xff0c;或建立Application Sw Component来补齐基础软件需要提供的功能实现。当面对具体的项目时&#xff0c;基础软件开发人员还可…...

java通过ocr实现识别pdf中的文字

需求&#xff1a;识别pdf文件中的中文 根据github项目mymonstercat 改造,先将pdf文件转为png文件存于临时文件夹&#xff0c;然后通过RapidOcr转为文字,最后删除临时文件夹 1、引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId&g…...

Git 命令代码管理详解

一、Git 初相识&#xff1a;版本控制的神器 在当今的软件开发领域&#xff0c;版本控制如同基石般重要&#xff0c;而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造&#xff0c;最初是为了更好地管理 Linux 内核源代码。随着时间的推移&#xff0c;Git 凭借…...

Docker的安装和使用

容器技术 容器与虚拟机的区别 虚拟机 (VM) VM包含完整的操作系统&#xff0c;并在虚拟化层之上运行多个操作系统实例。 VM需要更多的系统资源&#xff08;CPU、内存、存储&#xff09;来管理这些操作系统实例。 容器 (Container) 容器共享主机操作系统的内核&#xff0c;具…...

Flink系统知识讲解之:Flink内存管理详解

Flink系统知识讲解之&#xff1a;Flink内存管理详解 在现阶段&#xff0c;大部分开源的大数据计算引擎都是用Java或者是基于JVM的编程语言实现的&#xff0c;如Apache Hadoop、Apache Spark、Apache Drill、Apache Flink等。Java语言的好处是不用考虑底层&#xff0c;降低了程…...

使用JMeter模拟多IP发送请求!

你是否曾遇到过这样的场景&#xff1a;使用 JMeter 进行压力测试时&#xff0c;单一 IP 被服务器限流或者屏蔽&#xff1f;这时&#xff0c;如何让 JMeter 模拟多个 IP 发送请求&#xff0c;成功突破测试限制&#xff0c;成为测试工程师必须攻克的难题。今天&#xff0c;我们就…...

【Ubuntu与Linux操作系统:六、软件包管理】

第6章 软件包管理 6.1 Linux软件安装基础 Linux的软件包是以二进制或源码形式发布的程序集合&#xff0c;包含程序文件和元数据。软件包管理器是Linux系统的重要工具&#xff0c;用于安装、更新和卸载软件。 1. 常见的软件包管理器&#xff1a; DEB 系统&#xff08;如Ubunt…...

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列&#xff0c;需要 processingTimei 的时长完成执行。 现…...

【前端动效】原生js实现拖拽排课效果

目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;页面左侧有一个包含不同课程&#xff08;如语文、数学等&#xff09;的列表&#xff0c;页面右侧…...

C#使用OpenTK绘制3D可拖动旋转图形三棱锥

接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…...

排序的本质、数据类型及算法选择

排序的本质、数据类型及算法选择 一、排序的本质二、排序的数据类型三、排序算法的选择依据 前两天老金写了篇 “十大排序简介”&#xff0c;有点意犹未尽&#xff0c;这一回老金想把排序连根拔起&#xff0c;从排序的本质说道说道。 一、排序的本质 从字面上理解&#xff0c…...

Python的列表基础知识点(超详细流程)

目录 一、环境搭建 二、列表 2.1 详情 2.2 列表定义 2.3 列表长度 2.4 列表索引 2.5 切片索引 2.6 添加 2.7 插入 2.8 剔除 2.8.1 pop方法 2.8.2 del方法 2.9 任何数据类型 2.10 拼接 2.10.1 “” 2.10.2 “*” 2.11 逆序 ​编辑 2.12 计算出现次数 2.13 排序…...

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现 最近在学习鸿蒙开发过程中&#xff0c;阅读了官方文档&#xff0c;在之前做flutter时候&#xff0c;经常使用overlay&#xff0c;使用OverlayEntry加入到overlayState来做添加悬浮按钮、提示弹窗、加载中指示器、加载失败的t…...

【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】

第1章 Ubuntu安装与基本使用 1.1 Linux与Ubuntu Linux是一种开源、类Unix操作系统内核&#xff0c;拥有高稳定性和强大的网络功能。由于其开源性和灵活性&#xff0c;Linux被广泛应用于服务器、嵌入式设备以及桌面环境中。 Ubuntu是基于Debian的一个流行Linux发行版&#xf…...

React 元素渲染

React 元素渲染 React 是一个用于构建用户界面的 JavaScript 库&#xff0c;它允许开发人员创建大型应用程序&#xff0c;这些应用程序可以随着时间的推移而高效地更新和渲染。React 的核心概念之一是元素渲染&#xff0c;它描述了如何将 JavaScript 对象转换为 DOM&#xff0…...

引擎网站推广法怎么做/网站推广和优化的原因网络营销

使用Git Gui的查看中文代码的时候&#xff0c;会出现乱码&#xff0c;如下&#xff1a; 解决方法&#xff1a; 1、在乱码的区域点击鼠标右键&#xff0c;选择Encoding&#xff0c;然后选择Unicode&#xff08;UTF-8&#xff09; 2、最终乱码问题解决&#xff0c;如下图&#x…...

网站一般做多大像素/品牌推广渠道有哪些

简单有效的文本匹配&#xff0c;具有更丰富的对齐功能 github: https://github.com/daiyizheng/shortTextMatch/blob/master/src/DL_model/classic_models/models/RE2.py 本文作者提出了一种快速、强神经网络的通用文本匹配方法。保持序列间对齐可用的三个关键特征:原始点方向…...

网站建设公司服务/sem是什么?

就这样转载于:https://www.cnblogs.com/zhangkaikai/p/9021219.html...

网络营销做女鞋的网站设计/如何在百度上打广告

华为IPv6toIPv41 实验介绍1.1 关于本实验1.2 实验目的1.3 实验组网介绍1.4 实验规划2 实验任务配置2.1 配置思路2.2 配置步骤3 结果验证3.1 检查配置结果1 实验介绍 1.1 关于本实验 IPv6是Internet Protocol Version 6的缩写&#xff0c;其中Internet Protocol译为“互联网协…...

金寨县建设规划局网站/必应搜索引擎入口

1.同步的前提 多个线程 多个线程使用的是同一个锁 2.同步的好处 同步的出现解决了多线程的安全问题 3.同步的弊端 当线程较多时, 因为每个线程都会去判断同步上的锁, 这样是很耗费资源的, 会降低程序的运行效率. 4.同步方法: 1.就是将同步关键字, synchronized加到方法上, 此时…...

游戏门户网站 织梦/重庆seo整站优化方案范文

题意&#xff1a;一棵带边权的树&#xff0c;边权可单边修改&#xff0c;问初始时和每次修改后有多少条路径$\gcd1$ 首先考虑用反演求答案&#xff0c;设$f(n)$为路径$\gcdn$的路径条数&#xff0c;$g(n)$为路径$\gcd$是$n$倍数的路径条数&#xff0c;那么$g(n)\sum\limits_{n|…...