Warshall‘s algorithm 算法的实现及优化

弗洛伊德-华沙算法案例及实现 对于弗洛伊德-华沙算法代码实现,使用如下的例子作为算法运行的例子:添加图片注释,不超过 140 字(可选)先使用代码并配合适当的数据结构将图中节点 vertex_list = [0, 1, 2, 3, 4, 5, 6, 7, 8] #记录图中所有节点 edge_vertex = {} #记录相连节点 edge_vertex[0] = [1] edge_vertex[1] = [7] edge_vertex[2] = [1, 5] edge_vertex[3] = [2, 4] edge_ver 阅读详情

用 Warshall’s 算法计算传递闭包

(1)时间复杂度为:O(nnn)
(2)用R的无穷闭包时间复杂度为O(nnn*(n - 1))

经典实现:

下面展示一些 经典代码片。

void computeAPSP(const int n) {
    /* calculate shortest paths from every vertex to every vertex */
    for (int k = 0; k < n; k++) 
    {
        for (int i = 0; i < n; i++) 
        {
            for (int j = 0; j < n; j++) 
            {
                a[i][j] = min( a[i][j], a[i][k] + a[k][j] );
            }
        }
    }
}

利用矩阵的对称性优化:

void computeAPSP(const int n) 
{
    for (int k = 0; k < n; k++) 
    {
        for (int i = 0; i < n; i++) 
        {
            if (k != i) 
            {

                const int a_ki = (k < i) ? a[i][k] : a[k][i];

                for (int j = 0; j < min(k, i); j++)
                    a[i][j] = min( a[i][j], a_ki + a[k][j] );

                for (int j = k + 1; j < i; j++)
                    a[i][j] = min( a[i][j], a_ki + a[j][k] );

            }
        }
    }
}

只使用矩阵的下三角部分进行优化:

void computeAPSP(const int n) 
{
    for (int k = 0; k < n; k++) 
    {
        for (int i = 0; i < n; i++) 
        {
            if (k != i) 
            {

                const int a_ki = (k < i) ? a[i][k] : a[k][i];

                for (int j = 0; j < min(k, i); j++)
                    a[i][j] = min( a[i][j], a_ki + a[k][j] );

                for (int j = k + 1; j < i; j++)
                    a[i][j] = min( a[i][j], a_ki + a[j][k] );

            }
        }
    }
}

避免大量调用数学函数进行优化:

void computeAPSP(const int n) 
{
    for (int k = 0; k < n; k++) 
    {
        for (int i = 0; i < n; i++) 
        {
            if (k != i) 
            {

                const int a_ki = (k < i) ? a[i][k] : a[k][i];

                // skip if no path
                if (a_ki == POSITIVE_INFINITY)    continue;

                for (int j = 0; j < min(k, i); j++) 
                {
                    const int s_kj = a_ki + a[k][j];
                    if( s_kj < a[i][j] )    a[i][j] = s_kj;
                }

                for (int j = k + 1; j < i; j++) 
                {
                    const int s_jk = a_ki + a[j][k];
                    if( s_jk < a[i][j] )    a[i][j] = s_jk;
                }

            }
        }
    }
}
Warshall’s Algorithm: Transitive Closure小理解 对传递闭包的小理解。 阅读详情

相关推荐

Dijkstra算法与城市最短路问题详解

最短路算法是图论中的基础问题,用于求解图中两点间的最短路径。Dijkstra算法作为经典的单源最短路算法,采用贪心策略,通过优先队列实现高效搜索。这类算法在导航系统、物流配送等实际场景中有广泛应用。信息学竞赛中常考察Dijkstra及其变种,同时还需掌握Floyd、Bellman-Ford等其他最短路算法。理解不同算法的原理和适用场景,能帮助开发者根据图结构特点选择最优解法,提升路径规划效率。

weixin_33727510的博客 460

Warshall‘s algorithm 算法的实现及优化(修改版)

用 Warshall’s 算法计算传递闭包 离散数学定义: t® = R u R^2 u R^3 u… 其中R^(n+1) = R^n 复合 R 矩阵表示: M(R) = M + M^2 + M^3 +…+M^n(其中加为逻辑加) 所以我们只要按照这个公式每次更新M,最后的Mn就是传递闭包。 Warshall算法: (1)置新矩阵A=M; (2)i=1; (3)对所有j如果A[j,i]=1,则对k=1,2,…,n,A[j,k]=A[j,k]∨A[i,k]; (4)i加1;(i是行,j是列) (5)如

Partonnn的博客 1458

24、Dijkstra‘s Algorithm: Finding the Shortest Path in Weighted Graphs

本博客深入解析了Dijkstra算法的原理、实现步骤及其在加权图中寻找最短路径的应用。从基础概念到详细执行过程,再到C语言代码实现,内容涵盖算法步骤、可视化流程、性能分析、优化策略以及实际应用场景如网络路由和交通导航系统。此外,还比较了Dijkstra与其他最短路径算法(如Bellman-Ford、Floyd-Warshall和A*),并讨论了其局限性和处理特殊情况的方法。适用于希望掌握图论算法及其实战应用的开发者和技术爱好者。

u5v6w7的博客 193

Warshall 算法

Warshall算法 介绍: Warshall在1962年提出了一个求关系的传递闭包的有效算法。其具体过程如下: N—S图 代码实现: import java.util.Scanner; public class Warshall { public static void main(String[] args) { System.out.println("请输入矩阵阶数:"); ...

奇迹 1万+

Warshall算法(邻接矩阵到可达矩阵)

采用Warshall算法,从邻接矩阵求可达矩阵

Warshall算法改进

改进Warshall算法,使得求解结果中可以查询任意两个顶点之间的一条路径。 特点:附全部源码和可执行程序。 具有十分有好的操作界面。

离散数学中Warshall算法简析

离散数学中Warshall算法简析最近学了离散数学的图论,突然感觉离散数学的作用十分强大,相信学好离散数学中的算法,编程的魅力也不言而喻。闲话不多说,这篇博客中记录的是Warshall算法的简单解析及C++代码实现。 问题引出:在一个图结构中,常常需要找两个节点之间有没有一条通路(通路长任意),也就是任意两点之间的可达情况,我们很自然会联想到用邻接矩阵来求可达矩阵,从而得出两点之间的可达情况。如:

razorEdge的博客 2万+

Warshall算法在MPI中的实现及优化 (2007年)

Message Passing Interface并行编程方法是目前编程人员广泛使用的方法之一,但此方法将并行性开发的任务完全交给编程人员,程序的质量与效率往往因编程人员水平及风格不同而各异。在Message Passing Interface环境下把传统串行程序转变为并行程序从而提高其性能。此外通过M PI 所提供的函数来进一步优化并行程序以便提高其性能。

Floyd-Warshall算法(Floyd-Warshall algorithm)

Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理带权有向图或负权的最短路径问题    解决此问题有两种方法: 其一是分别以图中每个顶点为源点共调用n次算法; 其二是采用Floyd算法。    两种算法的时间复杂度均为O(n3),但后者形式上比较简单。 Floyd算法的基本思想:  (1)

songyux6的专栏 4824

在Jetson Orin (Arm64)上从Ubuntu22.04回退至20.04的完整指南及ROS-noetic适配方案

本文提供了在Jetson Orin (Arm64)设备上将Ubuntu 22.04系统回退至20.04 LTS版本的完整操作指南。针对机器人开发中ROS-noetic对Ubuntu20.04的官方最佳支持,详细阐述了从关键备份、软件源与APT优先级配置、系统降级执行到后续问题排查的全过程,并附带了在Arm64架构上成功安装和验证ROS-noetic的适配方案,旨在为开发者构建稳定可靠的机器人开发环境。

flower的专栏 580

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX + CMSIS-DSP 手动添加、库添加方式

CMSIS-DSP库在工程中应用遇到的所有问题进行归纳终结

洋洋的博客 1万+

Warshall’s Algorithm: Exploring Transitive Closure with Matrix Operations

本文深入解析了Warshall算法及其在计算传递闭包中的应用,通过矩阵操作和动态规划思想,高效解决图论中的可达性问题。文章详细拆解了算法的核心逻辑,对比了与Floyd算法的异同,并探讨了矩阵快速幂等优化技巧,为开发者提供了实用的实现建议和常见陷阱分析。

weixin_28713947的博客 379

Colab虚拟环境配置全攻略:从安装到实战应用

本文详细介绍了在Google Colab中配置Python虚拟环境的完整流程与实战技巧。通过安装Anaconda、创建独立环境、解决常见错误及结合深度学习项目应用,帮助用户有效管理依赖、避免冲突,并利用环境持久化策略提升在Colab中的开发效率与项目可复现性。

weixin_29204121的博客 341

Warshall’s Algorithm: Exploring Transitive Closure in Graph Theory

本文深入浅出地介绍了Warshall算法及其核心应用——计算有向图的传递闭包。通过生动的社交网络类比和详细的步骤演示,文章阐明了该算法如何利用动态规划思想,高效解决图论中的可达性问题。同时,文章还探讨了其在编译器分析、数据库查询等领域的实际应用,并提供了清晰的代码实现。

ggg99的专栏 159

智能车竞赛飞檐走壁组立体赛道电磁引导线设计与实现

本文深入解析了智能车竞赛飞檐走壁组立体赛道电磁引导线的核心设计与实现。针对垂直面、圆筒、跷跷板等立体元素,详细阐述了电磁线规格参数选择、三维空间铺设技巧及磁场调试方法,旨在帮助参赛队伍打造稳定可靠的导航系统,提升车模在复杂立体赛道上的通过率与稳定性。

bert9linguist的博客 281

ifix5.8连接ab plc的点-通过rslinx

以ifix连接ab plc的点为例 1.先在rslinx上把plc的点导出为opc server 2.使用opc power tool 作为opc client 去连接 3.保存到项目的PDB文件夹下面,并且以节点名命名。 也可以不以节点名命名,系统自动会生成一个以节点名命名的这种文件,就显得很乱。 同时,项目的PDB目录下面必须还得拷过来一个de...

中国智造2025 4114

最短路径算法全解析:从Dijkstra到Floyd-Warshall的建模与实战

最短路径问题是图论中的核心基础概念,旨在寻找网络中两点之间成本最低的通行方案。其基本原理是将现实世界的实体抽象为节点,连接关系抽象为边,并通过权值量化通行成本,从而构建可计算的图模型。该技术的核心价值在于为复杂系统的效率优化提供了数学模型和算法工具,广泛应用于物流配送、交通规划、网络路由和社交关系分析等领域。本文以数学建模和工程实践为背景,深入剖析了Dijkstra、Bellman-Ford和Floyd-Warshall三大经典算法的原理、实现与适用场景,并结合物流配送和网络路由等具体案例,分享了从问题抽象

weixin_33843409的博客 303

BAPI_OUTB_DELIVERY_CHANGE扩展指南:利用EXTENSION2与SMOD_V50B0001实现自定义字段更新

本文详细解析了如何利用BAPI_OUTB_DELIVERY_CHANGE的EXTENSION2参数与增强点SMOD_V50B0001,在不修改标准代码的前提下,安全、标准地更新SAP交货单的自定义字段。通过清晰的步骤指南和实战代码示例,帮助开发者掌握通过增强字段实现定制化业务需求的完整流程与调试技巧。

fanta的博客 451

Apache OpenWhisk 运维管理实战指南:使用 wskadmin 管理用户、命名空间限额与排查数据库/日志

`wskadmin` 是 Apache OpenWhisk 官方提供的管理命令行工具,用于对部署实例执行各类管理操作:创建用户(subject)、管理其命名空间与授权密钥(Authorization Key)、封禁/解封或彻底删除用户记录,还能直接转储资产(whisks)、激活(activations)与用户(subjects)数据库、查询视图,以及按组件或事务 ID 检索系统日志。本文以 [to

gitblog_00628的博客 16

川崎机器人总线通信_三菱PLC和发那科机器人进行CCLINK总线通信

三菱CCLINK主站模块采用QJ61BT11N,该模块用在Q系列PLC上,如果是5U或3UPLC,可用FX5-CNV-BUS加FX3U-16CCL-M或FX5-CCL-M模块。本教程以Q系列为例CCLINK接线方法如下模块拨码含义如下接线和拨码设置好后,接着在编程软件上设置CCLINK通信参数打开编程软件,在工程导航栏打开参数——网络参数,选中CCLINK打开。打开如下画面起始IO为模块本体占用I...

weixin_42300398的博客 7549

世界职业院校技能大赛商贸赛道项目参考逐字稿一

商贸赛道“智选优品”—基于大数据与AI驱动的跨境电商平台项目参考逐字稿您订阅本专栏后即可`永久享有所有文章的查阅权`,希望我们更新的参考资料能帮助到您。如果您需要我们团队赋能培训可联系我(企业一线工程师及国一获奖选手在线培训支持:每周直播精讲(可回放,支持弹幕答疑)、代码Review+技术售后(拉群随时问,12h内响应)、④路演PPT+答辩话术一对一点评,评委视角提前彩排、适合:中职/高职赛项选手、指导老师带队、校企工作室、整校打包另谈(可开发票))

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1587

Bellman-Ford Algorithm and Dijkstra Algorithm

最近在看《挑战程序设计竞赛》,边看边整理一些知识,这篇内容是有关最短路径的几个主要的算法: Bellman-Ford Algorithm、Dijkstra Algorithm、Floyd-Warshall Algorithm 前两者主要是针对单源最短路问题,后者用来解决任意两点之间的最短路径以及求传递闭包问题的 1.Bellman-Ford Algorithm 这个算法的原理可

kornberg_fresnel的博客 581

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MATLAB实现最短路算法:从Dijkstra到动态规划实战指南

最短路问题是图论与运筹学中的核心基础问题,旨在寻找网络中两点间成本最低的路径。其核心原理基于贪心策略(如Dijkstra算法)或动态规划(如Floyd-Warshall算法),通过迭代松弛操作逐步逼近最优解。该技术在工程领域具有重要价值,是实现高效资源调配与路径优化的数学基础,广泛应用于物流配送、网络路由、交通规划等场景。本文结合MATLAB编程环境,深入解析Dijkstra、Bellman-Ford等经典算法的实现细节与适用条件,并通过应急物资配送等建模案例,演示如何将理论算法转化为解决实际工程问题的实用

weixin_34013044的博客 403

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Coursera - Algorithm (Stanford) - 课程笔记 - Week 13

Bellman Ford Algorithm 单源最短路问题定义 输入:有向图,已知各边长度,以及源点sss 输出:计算从源点出发,到达图中个点最短路的长度 Dijkstra算法的问题 对于存在负权边的情形,并不总是正确的 并不是十分的分布式 对于负权环的问题 方案1:允许负权环的存在——得不到最短路 方案2:要求无环最短路的计算——汉密尔顿遍历问题,NP完全问题 方案3:允许负权边,但不允许负权环——BF算法 目标 计算所有顶点的单源最短路径长度——BF算法 或者输出负环 最优子

支锦铭的博客 318

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

单源最短路Dijkstra's algorithm径

整理收录了wiki和http://www.nocow.cn的一部分算法: 迪科斯彻算法(Dijkstra's algorithm) 伪代码 在下面的算法中,u := Extract_Min(Q) 在顶点集合 Q 中搜索有最小的 d[u] 值的顶点 u。这个顶点被从集合 Q 中删除并返回给用户。 1 function Dijkstra(G, w, s) 2

To lose to pursue. 976
上一篇: Kruskal算法的实现(C++)
下一篇: Warshall‘s algorithm 算法的实现及优化(修改版)
努力做小马
博客等级 码龄7年 811粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值