日撸 Java 三百行day32

news2024/9/20 14:35:02

文章目录

  • 说明
  • day32 图的连通性检测
    • 1.思路
      • 1.1矩阵表示
      • 1.2.矩阵相乘
      • 1.3结合矩阵运算思考图的连通性。
    • 2.代码

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day32 图的连通性检测

1.思路

1.1矩阵表示

看一个矩阵M,Vi->Vj值不为0,则说明vi能到vj(对角线表示自身)
在这里插入图片描述

1.2.矩阵相乘

矩阵相乘运算(如MM = M^2 )。矩阵运算:求一个结点的运算 ∑ i = 1 n m i k ⋅ m k j \displaystyle\sum_{i=1}^{n} m_{ik}\cdot m_{kj} i=1nmikmkj
在这里插入图片描述
结合上面的图,三个结点1 2 3; m32 = 1代表3到2有路径,m32
m21 = 1 代表代表3到2有路径,且2到1有路径,进而3到1有路径,只不过需要通过2这个结点。如这里m31m11+m32m21+m33*m31=1表明3到1 只有一条路径。

1.3结合矩阵运算思考图的连通性。

  • (1) 连通
    当Vi->Vj不能直连时(若最后能相连)则其中会经过一个或几个中间结点。Vi->Vk,Vk->Vj.
    所以假设 m i k ⋅ m k j = 1 m_{ik}\cdot m_{kj}=1 mikmkj=1 可以理解为从Vi->Vk有路径,Vk->Vj有路径,则相乘为1,则Vi->Vj就存在一条路径,且长度是为2的路径连通。 通过公式
    ∑ k = 1 n m i k ⋅ m k j \sum_{k=1}^{n}m_{ik}\cdot m_{kj} k=1nmikmkj 若值等于0说明不连通,若值大于0说明连通,且可以知道Vi到Vj有几条路。

  • (2) 不连通
    假设 m i k ⋅ m k j = 0 m_{ik}\cdot m_{kj}=0 mikmkj=0表示不存在Vi->Vj这样的路径.​
    所以矩阵相乘可以去看矩阵的连通性。进一步 M n M^{n} Mn就是长度为m路的数目。

2.代码

再来看文章中: M a = M 0 + M 1 + . . . + M n − 1 M_{a} = M^{0} + M^{1} + ...+ M^{n-1} Ma=M0+M1+...+Mn1 有n个结点,为什么只需要到n-1?因为假设有n个结点,最多需要n-1条边连起来。今天这个根据矩阵的运算来判断图的连通性,以前我只知道通过遍历图看图的连通性,今天从数学角度去思考图的连通性,有收获!再去读代码写代码就很好理解了(我觉得主要的逻辑代码就在getConnectivity方法中的step3中的这一个for循环中)。

package graph;

import matrix.IntMatrix;
public class Graph {

    IntMatrix connectivityMatrix;

    /**
     * The first constructor.
     * @param paraNumNodes The number of nodes in the graph.
     */
    public Graph(int paraNumNodes){
        connectivityMatrix = new IntMatrix(paraNumNodes, paraNumNodes);
    }

    /**
     * The second constructor.
     * @param paraMatrix The data matrix.
     */
    public Graph(int[][] paraMatrix){
        connectivityMatrix = new IntMatrix(paraMatrix);
    }

    @Override
    public String toString(){
        return "This is the connectivity matrix of the graph.\r\n" + connectivityMatrix;
    }

    /**
     * Get the connectivity of the graph.
     * @return
     */
    public boolean getConnectivity() throws Exception {
        // Step 1. Initialize accumulated matrix.
        IntMatrix tempConnectivityMatrix = IntMatrix.getIdentityMatrix(connectivityMatrix.getData().length);

        //Step 2. Initialize
        IntMatrix tempMultipliedMatrix = new IntMatrix(connectivityMatrix);

        //Step 3. Determine the actual connectivity.
        for (int i = 0; i < connectivityMatrix.getData().length - 1; i++){
            // M_a = M_a + M^k
            tempConnectivityMatrix.add(tempMultipliedMatrix);
            // M^k
            tempMultipliedMatrix = IntMatrix.multiply(tempMultipliedMatrix, connectivityMatrix);
        }

        // Step 4. Check the connectivity.
        System.out.println("The connectivity matrix is: " + tempConnectivityMatrix);
        int[][] tempData = tempConnectivityMatrix.getData();
        for (int i = 0; i < tempData.length; i++) {
            for (int j = 0; j < tempData.length; j++){
                if (tempData[i][j] == 0){
                    System.out.println("Node " + i + " cannot reach " + j);
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * Unit test for getConnectivity.
     */
    public static void getConnectivityTest(){
        int[][] tempMatrix = { { 0, 1, 0 }, { 1, 0, 1 }, { 0, 1, 0 } };
        Graph tempGraph2 = new Graph(tempMatrix);
        System.out.println(tempGraph2);

        boolean tempConnected = false;
        try {
            tempConnected = tempGraph2.getConnectivity();
        } catch (Exception ee) {
            System.out.println(ee.getMessage());
        }
        System.out.println("Is the graph connected? " + tempConnected);

        //Test a directed graph. Remove one arc to form a directed graph.
        tempGraph2.connectivityMatrix.setValue(1, 0, 0);
        tempConnected = false;
        try {
            tempConnected = tempGraph2.getConnectivity();
        } catch (Exception ee) {
            System.out.println(ee);
        }

        System.out.println("Is the graph connected? " + tempConnected);

    }

    public static void main(String[] args) {
        System.out.println("Hello!");
        Graph tempGraph = new Graph(3);
        System.out.println(tempGraph);

        // Unit test.
        getConnectivityTest();
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下安装navicat

1.在https://www.navicat.com.cn/download/navicat-premium下载navicat安装包 2.在终端执行命令 给navicat16-premium-cs.AppImage赋予可执行的权限 chmod x navicat16-premium-cs.AppImage 启动Navicat16 ./navicat16-premium-cs.AppImage 3.点击连接——mysql——输入连…

java单机秒杀扛1万并发方案和代码

我们先来看普通的加锁加事务秒杀性能, 说明: 1.这里的秒杀业务执行一次耗时100毫秒 2.电脑配置16g内存 4核8线程 cpu i7 7代,数据库连接池max20 RequestMapping("/purchase2")public ResultJson purchase2( Long productId){int userId new Random().nextInt(10…

2 常见模块库(2)

2.5 复用器与分路器模块 Mux是一种用于将多个信号组合成一个信号的模块。Mux模块的名称来源于多路复用器&#xff08;Multiplexer&#xff09;。 使用Mux可以将多个输入信号组合成一个向量或矩阵&#xff0c;以便在模型中传递和处理。Mux模块可以接受任意数量的输入信号&#x…

Visio Studio 2017利用Qt插件开发Qt应用的安装方法

Visio Studio 2017利用Qt插件开发Qt应用的安装方法 1 安装Visio Studio 20172 安装QT3 在Visio Studio 2017中安装Qt插件 本教程介绍如何利用Visio Studio 2017&#xff0c;开发Qt.5.14.2的Qt应用 1 安装Visio Studio 2017 链接&#xff1a;https://pan.baidu.com/s/1t9j1fFj3…

Linux --- 简介、安装

一、Linux简介 1.1、主流操作系统 不同领域的主流操作系统&#xff0c;主要分为以下这么几类&#xff1a; 桌面操作系统、服务器操作系统、移动设备操作 系统、嵌入式操作系统。接下来&#xff0c;这几个领域中&#xff0c;代表性的操作系统是那些? 1、桌面操作系统 2、服务…

2023年农牧行业数字化:7大CRM软件、5大场景盘点

目录 一、5大业务场景能力&#xff0c;解密农牧行业持续增长秘籍 1、营销获客 2、客户管理 3、商机管理 4、生态“互联”能力 5、业财一体化 二、农牧行业企业CRM选型指南 1、SaaS模式或私有部署 2、是否具有行业成功“经验” 3、可扩展性 4、以营销为主题的体系建设…

【MySQL】基础介绍及表操作

目录 1.MySQL是什么&#xff1f; 2.为什么要学习数据库呢&#xff1f; 内存和硬盘的区别 3.数据库基本操作 1.创建数据库 2.使用数据库 3.删除数据库&#xff08;慎用&#xff09; 4.查看警告信息 5.查询当前数据可服务使用的编码集 7.表操作 1.创建一个学生成绩表 2…

Spring Cloud微服务网关Zuul过滤链和整合OAuth2+JWT入门实战

一、Spring Cloud Zuul 过滤链 1.1 工作原理 Zuul的核心逻辑是由一系列的Filter来实现的&#xff0c;他们能够在进行HTTP请求或者相应的时候执行相关操作。Zuul Filter的主要特性有一下几点&#xff1a; Filter的类型&#xff1a;Filter的类型决定了它在Filter链中的执行顺序…

解决Ubunt20.04安装Sogou输入法失败进不去桌面 及 中文输入法安装

目录解决Ubunt20.04安装Sogou输入法失败进不去桌面中文输入法安装解决wps无法输入中文解决Ubunt20.04安装Sogou输入法失败进不去桌面 问题&#xff1a; Ubuntu20.04 安装了 fcitx 和 sogou 输入法&#xff1b;键盘输入法系统由 IBus 改成了 fcitx&#xff1b;重启后可以出现登…

文心一言 VS chatgpt (11)-- 算法导论2.3 7题 3.1 4~5题

四、2 ^ (n1)O(2 ^ n)成立吗? 2^(2n)O(2 ^ n)成立吗? 文心一言&#xff1a; chatgpt&#xff1a; 第一个式子不成立&#xff0c;第二个式子成立。 2 ^ (n1) O(2 ^ n) 该式不成立。按照大O符号的定义&#xff0c;如果存在正常数c和n0&#xff0c;使得n>n0时&#xf…

旋转矩阵与欧拉角

其他相关的内容网上很多&#xff0c;这里就简单记录一下不同欧拉角分解顺序时&#xff0c;对应的角度怎么计算 #include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std; #define PI acos(-1)void getEulerAngles(Mat& ro…

Spring项目整合Minio分布式的对象存储系统

文章目录 安装Docker安装Docker-compose安装 SpringBoot集成引入依赖初始化客户端存储桶的CRUD存储桶的文件操作存储桶生命周期配置 安装 Docker安装 docker run -p 9000:9000 -p 9090:9090 \--nethost \--name minio \-d --restartalways \-e "MINIO_ACCESS_KEYadmin&q…

01-Linux-磁盘分区与目录配置

1. 主引导纪录和磁盘分区表 1.1 MBR分区表 启动引导程序记录区与分区表都放在磁盘的第一个扇区&#xff08;512B&#xff09; 由于分区表仅占 64B&#xff0c;因此最多能有四组记录区&#xff0c;每组记录区记录了该区段的起始与结束的柱面号码。 缺点如下&#xff1a; 操作…

设计模式-创建型模式之工厂方法模式(Factory Method Pattern)

3.工厂方法模式(Factory Method Pattern)3.1. 模式动机现在对该系统进行修改&#xff0c;不再设计一个按钮工厂类来统一负责所有产品的创建&#xff0c;而是将具体按钮的创建过程交给专门的工厂子类去完成&#xff0c;我们先定义一个抽象的按钮工厂类&#xff0c;再定义具体的工…

vue项目导入excel成功后下载导入结果(后端返回的list数组)

需求&#xff1a; 点击批量导入按钮&#xff0c;弹出弹窗。 下载模板如图二 上传后&#xff0c;如果有错误&#xff0c;会弹出提示&#xff0c;如图三 点击查看失败原因&#xff0c;会自动下载失败的excel如图四。 请求参数和返回结果 1. vue项目导出表格功能实现步骤 np…

十七、市场活动明细:添加备注

功能需求 用户在市场活动明细页面,输入备注内容,点击"保存"按钮,完成添加市场活动备注的功能. *备注内容不能为空 *添加成功之后,清空输入框,刷新备注列表 *添加失败,提示信息,输入框不清空,列表也不刷新 功能分析 流程图 代码实现 一、ActivityRemarkMapper 1.Ac…

笔记-Samba服务器的安装与配置

引言 代码编写我们是在Windows系统下的VS Code来编辑&#xff0c;但是代码在虚拟机的Ubuntu系统中&#xff0c;所以我们要先实现如何将在Ubuntu下的项目映射到Windows系统中&#xff0c;这时我们可以使用到samba服务器。 一、安装samba服务器 sudo apt-get install samba我这里…

【瑞吉外卖】003 -- 后台退出功能开发

本文章为对 黑马程序员Java项目实战《瑞吉外卖》的学习记录 目录 一、需求分析 二、代码开发 三、功能测试 四、分析后台页面构成和效果展示 1、Vue & Element 2、iframe 一、需求分析 前端页面分析&#xff1a; 前端页面&#xff0c;点击事件 点击事件 logout()&#x…

使用vscode写UML图

文章目录 环境配置关键字多图注释Title多行title图注头部或尾部添加注释多行header/footer放大率类图接口抽象类枚举 类型关系泛化关系&#xff0c;箭头指向父类实现关系&#xff0c;箭头指向接口依赖关系&#xff0c;箭头指向被依赖关系关联关系&#xff0c;指向被拥有者可以双…

QML控件--DelayButton

文章目录 一、控件基本信息二、控件使用三、属性四、信号 一、控件基本信息 Import Statement&#xff1a;import QtQuick.Controls 2.14 Since&#xff1a;Qt 5.9 Inherits&#xff1a;AbstractButton 二、控件使用 DelayButton是一个延时按钮&#xff0c;需要长按才能触发&…