Warshall算法(用法详解,并转换成代码的形式)

这篇具有很好参考价值的文章主要介绍了Warshall算法(用法详解,并转换成代码的形式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于Warshall算法,我先通过离散数学中求传递闭包来解释他的使用规则。

一般的,给定一个矩阵A(行列相等),我们对其使用Warshall算法:

//注,该矩阵上只有0或1两种元素,做加法时,1+1还是1

1、先找到该矩阵的对角线,并从对角线的左上方开始为第一个元素

2、以对角线上第一个元素为中心,按列展开,寻找中心所在的列中所有不为0的元素

3、将“ 该中心所在的行 ”加到“ 该中心所在的列 ”中所有不为0的元素所在的行

4、加完之后,以对角线上第二个元素为中心,按列展开,寻找该列中所有不为0的元素

5、重复“ 操作3 ”

6、一直到将对角线上所有元素都展开后结束。

在此特别强调!!!一定!一定!不要对中心按行展开来求!!!

可能有一些求到的结果没有问题,但是有些情况是会求到错误的结果,原因是有些数值会被忽略

以下用离散数学的具体问题来分析:

warshall,矩阵,线性代数,java

按列展开:在对角线上的第一个元素所在的列上 第一列第二行对于着(b,a),后域为a,则我们将a行加到b行上就会得到一个(b,b),这个(b,b)是怎么来的呢,R中有(b,a)和(a,b)因此他的传递闭包就会有(b,b),按照这个思路往下思考就会知道它是用什么原理解决传递闭包的问题了

传递闭包:就是R能构成传递关系的最小序偶集合

关系是序偶的集合,上边的R关系里边的元素就是序偶。

下边我们试试将其变成代码的形式:

写一个实现类

package Java_Warshall;
public class Warshall {
    int[][] num;
    public Warshall(int[][] num){
        this.num=num;
        count();
    }
    public int[][] count(){
        for(int i=0;i<num.length;i++){
            for(int j=0;j<num[i].length;j++){
                if(num[j][i]==1){   //寻找第i列第j行为1的元素
                    for(int i1=0;i1<num.length;i1++){
                        if(num[j][i1]==0&&num[i][i1]==1){  //判断j行中的各元素是否为0,和i行中的各元素是否为1
                            num[j][i1]=1;
                        }
                    }
                }
            }
        }
        return num;
    }

    public void print(){
        for(int i=0;i<num.length;i++){
            for(int j=0;j<num.length;j++){
                System.out.printf("%d ",num[i][j]);
            }
            System.out.println();
        }
    }
}

再写一个测试类

package Java_Warshall;
import java.util.*;
public class Demo {
    public static void main(String[] args) {
        int[][] num;
        Scanner s=new Scanner(System.in);
        System.out.print("请选择要输入几阶矩阵:");
        int n=s.nextInt();
        num=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                num[i][j]=s.nextInt();
            }
        }
        Warshall w=new Warshall(num);
        w.print();
    }
}

运行效果

warshall,矩阵,线性代数,java

 文章来源地址https://www.toymoban.com/news/detail-789285.html

到了这里,关于Warshall算法(用法详解,并转换成代码的形式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多源最短路径算法:Floyd-Warshall算法分析

    在有向赋权图中(可以存在 带负权值的路径 ,但不能存在 总权值为负数的环路 ),Floyd-Warshall算法可以求出 任意两个顶点间 的最短路径 假设图中有 N 个顶点,顶点按照 0~N-1 进行编号 算法中使用 二维数组 Dist 来记录点与点之间的最短路径长度, Dist[i][j] 表示第i个顶点到第j个顶点

    2024年02月09日
    浏览(39)
  • 算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)

    (蒟蒻的第四篇文章,希望dalao勿喷) (希望没问题) 声明: 1.本人变量定义的名称很low 2.本人用的方法也很low 3.但我觉得文章应该不low  (盲目自信) 第四篇文章讲讲Floyd算法 Floyd算法是一种寻找最短路径的常见算法,其特点是: 短,好理解(虽然其他算法也挺好理解的

    2023年04月09日
    浏览(34)
  • UVa247 Calling Circles(Floyd warshall算法)

    给定两个人相互打电话,如果a打给b,b打给c,c打给a,则说a,b,c在同一电话圈中。给出n个人的m次通话,输出所有的电话圈 用graph[u][v]=1表示u和v之间有打电话。在使用floyd算法计算所有的点对之间的值。graph[u][v]=1表示u,v之间有直接或者间接打电话。如果graph[u][v] = 1并且graph[v][u]

    2024年02月12日
    浏览(39)
  • open3d教程(二):可视化三维模型,并转换成点云(Python版本)

    可以自己用建模软件建立一个模型 从free3d免费下载 open3d.visualization. draw_geometries 参数: geometry_list ( List[open3d.geometry.Geometry]) : 要可视化的几何体列表. window_name( str ,  optional ,  default=\\\'Open3D\\\'): 展示模型的可视化窗口名称,默认是Open3d. width: 

    2024年02月11日
    浏览(50)
  • 数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式

    labelImg是一个开源的图像标注工具,用于创建图像标注数据集。它提供了一个简单易用的界面,允许用户通过绘制边界框或者创建多边形来标注图像中的对象。它支持多种常见的标注格式,如Pascal VOC、YOLO和COCO等。 使用labelImg,用户可以加载图像文件夹,逐个标注图像中的对

    2024年02月10日
    浏览(55)
  • open3d,读取stl/ply/obj/off/gltf/glb三维模型,并转换成点云,保存

    可以自己用建模软件建立一个模型 本案例使用模型的下载地址 可以从free3d免费下载,无需注册 效果: 效果: 均匀采样会在表面出现采样点聚集的现象,open3d实现了一种基于poisson_disk方法的采样,能实现表面的均匀采样 原理 :参数umber_of_points是最终采样的点数量,实际会先

    2024年02月11日
    浏览(62)
  • visual studio代码解析(注释)英文换成中文

    我们用visual studio看别人代码或者看函数不知道意思的时候,看官方提示,又是全英文看不懂,这种情况换成中文就会很大提高代码书写效率,大家也可以去看官方文档是怎么教我们做的https://docs.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense 官方文档中是拿NET5.0示例的,打

    2024年02月10日
    浏览(43)
  • visual studio代码解析(注释)英文换成中文包

    前文:我们用visual studio看别人代码或者看函数不知道意思的时候,看官方提示,又是全英文看不懂,这种情况换成中文就会很大提高代码书写效率,大家也可以去看官方文档是怎么教我们做的https://docs.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense 下载中文包 解压后得到下

    2024年02月13日
    浏览(53)
  • 【代码审计篇】 代码审计工具Fortify基本用法详解

    本篇文章讲解代码审计工具Fortify的基本用法,感兴趣的小伙伴可以研究学习一下,文中部分地方可能会有遗漏,麻烦各位大佬指正,深表感谢!!! Fortify全名叫 Fortify SCA ,是惠普公司HP的出品的一款源代码安全测试工具,这家公司也出品过另一款Web漏洞扫描器,叫做 Webin

    2024年02月05日
    浏览(41)
  • CSS:filter滤镜 详解(用法 + 代码 + 例子 + 效果)

    动图为 效果添加前后对比 。 经常用ps的应该知道这些的属性的含义,可以自己试一试看看不同参数都有什么样的效果。 作用是调整模糊度,单位像素。 例子 渐变光晕 其实是两个相同的div叠加,其中一个加上了模糊度。 作用是调整元素的亮度,单位百分数或小数,小于1暗

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包