Kruskal算法代码实现

2023-11-18

package com.kruskal;

import java.util.Arrays;

public class KruskalCase {

    private int edgeNum;//边的个数
    private char[] vertexs;//顶点个数
    private int[][] matrix;//邻接矩阵
    private static final int INF = Integer.MAX_VALUE;//表示连个顶点不能连通

    public KruskalCase(char[] vertexs, int[][] matrix) {
        //拿到顶点数
        int vlen = vertexs.length;
        //初始化顶点,复制拷贝的方式
        this.vertexs = new char[vlen];
        for (int i = 0; i < vlen; ++i) {
            this.vertexs[i] = vertexs[i];
        }

        //初始化边,复制拷贝的方式,这种方式里面的改变不影响传入的改变
        this.matrix = new int[vlen][vlen];
        for (int i = 0; i < vlen; ++i) {
            for (int j = 0; j < vlen; ++j) {
                this.matrix[i][j] = matrix[i][j];
            }
        }

        //统计边的个数
        for (int i = 0; i < vlen; ++i) {
            for (int j = i+1; j < vlen; ++j) {
                if (matrix[i][j] != INF) {
                    edgeNum++;
                }
            }
        }


    }

    //打印邻接矩阵
    public void print() {
        System.out.println("邻接矩阵为:");
        for (int i = 0; i < vertexs.length; ++i) {
            for (int j = 0; j < vertexs.length; ++j) {
                System.out.printf("%12d", matrix[i][j]);
            }
            System.out.println();
        }
    }


    public static void main(String[] args) {
        char[] vertexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
        int[][] matrix = {
                {0, 12, INF, INF, INF, 16, 24},
                {12, 0, 10, INF, INF, 7, INF},
                {INF, 10, 0, 3, 5, 6, INF},
                {INF, INF, 3, 0, 4, INF, INF},
                {INF, INF, 5, 4, 0, 2, 8},
                {16, 7, 6, INF, 2, 0, 9},
                {14, INF, INF, INF, 8, 9, 0}};
        KruskalCase kruskalCase = new KruskalCase(vertexs, matrix);
        kruskalCase.print();
        System.out.println("没有排序");
        System.out.println(Arrays.toString(kruskalCase.getEdges()));

        EData[] edges=kruskalCase.getEdges();
        kruskalCase.sortEdges(edges);
        System.out.println(Arrays.toString(edges));
        kruskalCase.kruskal();
    }

    //对边进行排序,这里用冒泡排序
    private void sortEdges(EData[] edges) {
        for (int i = 0; i < edges.length - 1; ++i) {
            for (int j = 0; j < edges.length - i - 1; ++j) {
                if (edges[j].weight > edges[j + 1].weight) {
                    EData temp = edges[j];
                    edges[j] = edges[j + 1];
                    edges[j + 1] = temp;
                }
            }
        }
    }

    //返回顶点对应的下标,如果找不到返回-1
    private int getPosition(char ch) {
        for (int i = 0; i < vertexs.length; ++i) {
            if (ch == vertexs[i]) {
                return i;
            }
        }
        return -1;
    }

    //获取图中的边,放到EData[]数组,后面需要遍历数组
    //通过邻接矩阵matrix获取
    private EData[] getEdges() {
        int index = 0;
        EData[] edges = new EData[edgeNum];
        for (int i = 0; i < vertexs.length; ++i) {
            for (int j = i + 1; j < vertexs.length; ++j) {

                if (matrix[i][j] != INF) {
                    edges[index++] = new EData(vertexs[i], vertexs[j], matrix[i][j]);
                }
            }

        }
        return edges;
    }

    // 获取下标为i的顶点的终点,用于判断两个顶点的终点是否相同
    // ends:该数组记录了各个顶点对应的终点是哪一个, ends数组是在遍历过程中逐步形成的
    // i:   表示传入的顶点对应的下标
    // 返回的就是下标为i的顶点对应的终点的下标
    // 我感觉这个函数的设计太刁了,你如果觉得一般,那你就是大佬
    private int getEnd(int[] ends, int i){
        //这个循环的设计太牛了,大佬写的太吊了
        while (ends[i] !=0){
            i=ends[i];
        }
        return i;
    }

    public void kruskal(){
        int index=0; //表示最后结果数组中有多少条边, 理论行是n-1条
        int[] ends= new int[edgeNum];// 用于保存"已有最小生成树"中每一个顶点在最下生成树中的终点

        //创建结果数组,保存最小生成树
        EData[] rets= new EData[edgeNum];

        //获取图中所有边的集合 该示例一共12条边
        EData[] edges= getEdges();
        System.out.println(edges.length);

        //按照边的权值排序
        sortEdges(edges);

        //遍历边的数组edges,将便添加到最小生成树,判断是否构成回路,如果没有构成,就加入到结果数组rets
        for(int i=0;i<edges.length;++i){
            //获取第i条边的第一个顶点(起点)
            int p1=getPosition(edges[i].start);
            //获取第i条边的第二个顶点
            int p2=getPosition(edges[i].end);

            //获取p1这个顶点在已有最小生成树中的终点
            //第一次加入时,由于ends里面的值开始全为0.第一次相当于返回顶点下标,具体可以看getEnd()方法的具体实现
            //也就是说如果第一次加入时,m是等于怕p1的
            int m=getEnd(ends, p1);
            //获取p1这个顶点在已有最小生成树中的终点
            int n=getEnd(ends, p2);

            //是否构成回路
            if(m!=n){//不构成回路
                ends[m]=n;
                rets[index++]=edges[i];
            }

        }

        //统计并打印最小生成树,输出rets
        System.out.println("最小生成树");
        for(int i=0;i<index;++i){
            System.out.println(rets[i]);
        }



    }





}

class EData {
    char start;
    char end;
    int weight;

    public EData(char start, char end, int weight) {
        this.start = start;
        this.end = end;
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "EData[<" + start +","+end+">="+ weight+"]" ;
        //return "EData{" + "start=" + start + ", end=" + end + ", weight=" + weight + '}';
    }
}

有什么疑问,可以评论或私信我

更多数据结构问题代码实现请查看一下链接

JavaTest/denglianbin/src/com · 邓联斌/deng_study - 码云 - 开源中国 (gitee.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kruskal算法代码实现 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 【MyBatis-Plus】详解Wrappers.<T> lambdaQuery()以及常用过滤方法

    Wrappers
  • Java 动态代理作用是什么?

    主要用来做方法的增强 让你可以在不修改源码的情况下 增强一些方法 在方法执行前后做任何你想做的事情 甚至根本不去执行这个方法 因为在 InvocationHandler的invoke方法中 你可以直接获取正在调用方法对应的 Method对象
  • linux kernel --component组件用法

    kernel component组件用法 linux component组件架构分析
  • 如何用mac搭建本地svn服务器(如何将mac变成版本管理服务器)

    前言 一 搭建本地svn服务器 1 建立代码库 2 配置文件修改 3 启动本地svn服务 二 搭建过程中常见问题 如果Mac os升级到10 0以上 自带的svn不支持了怎么办 三 mac本地使用svn软件管理svn库 cornerston
  • Linux多进程数据交换--共享内存

    个人博客地址 https cxx001 gitee io 基础 在linux系统开发当中 时常需要在多个进程之间交换数据 在多个进程之间交换数据 有很多方法 但最高效的方法莫过于共享内存 linux共享内存是通过tmpfs这个文件系统来实现
  • 第二十八节、基于深度学习的目标检测算法的综述(附代码,并附有一些算法英文翻译文章链接))...

    在前面几节中 我们已经介绍了什么是目标检测 以及如何进行目标检测 还提及了滑动窗口 bounding box 以及IOU 非极大值抑制等概念 这里将会综述一下当前目标检测的研究成果 并对几个经典的目标检测算法进行概述 本文内容来自基于深度学
  • APK 逆向工程 - 解析 apk 基本信息和方法调用图

    导读 在 Android 开发中 我们很少使用 Android 逆向去分析 apk 文件的 但是作为一个测试人员 我们要对这个 apk 文件进行一系列的分析 审核 测试 这篇文章讲解如何解析一个 apk 文件 主要从下面几方面介绍 解析前准
  • mysql show para_mysql中show命令的详细用法

    经过我测试的语句 show procedure status 显示数据库中所有存储的存储过程基本信息 包括所属数据库 存储过 程名称 创建时间等 show create procedure sp name 显示某一个存储过程的详细信息 a
  • MongoDB安装和批量写入

    本文主要以Ubuntu系统为例 记录安装部署MongoDB社区版 并进行批量数据写入 安装部署主要依据MongoDB官网指引 数据写入脚本为个人编写 如有需要可以直接使用 1 导入包管理系统使用的公钥 wget qO https www m
  • UML中依赖和关联,关联,聚合和组合的区别

    在UML中 依赖和关联经常无法进行区分 在类图中 不知道什么时候使用依赖 什么时候使用关联 来定义两个类之间的关系 今天看了一篇帖子 对这两种关系做了比较生动的区分 依赖指的是两个类之间发生的关系输入偶然发生的 例如人和船之间的关系就是这种
  • Video_Codec_SDK压缩编码视频并封装为MP4格式

    在深度学习处理视频过程中 通常是先解码视频获取视频帧并转为cv Mat后进行处理 本章介绍如何将处理后的图片使用GPU编码为视频码流并封装为MP4格式 开发硬件 I7 9750H GTX1660ti 操作系统 Ubuntu16 04 驱动版
  • 24种设计模式之单例模式(饿汉式、懒汉式)

    一 单例模式 单例模式 Singleton Pattern 是指确保一个类在任何情况下都绝对只有一个实例 并提供一个全局访问点 单例模式是创建型模式 单例模式在现实生活中应用也非常广泛 例如 总统 班主任等 J2EE标准中的ServletC
  • 理解SPDX

    SPDX The Software Package Data Exchange SPDE an open standard for communicating software bill of material information in
  • 基于RFID技术在物流仓储中的解决方案—铨顺宏FUWIT

    一 行业背景 2011年6月8日国务院出台物流行业新国八条 明确指出要推进物流技术创新和应用 加强物流新技术自主研发 加快仓储物流设备研制 制定和推广物流标准 适时启动物联网的应用示范 推进物流信息资源开放共享 物流信息化 指在物流活动中全
  • 基于Opencv的水位识别,液面识别、高度识别

    Update 代码已经上传到github上了 可以点这里 Cutting 一直说这要整理一下Computer Vision课程的大作业 拖了好久 这两天忙着写一个订单处理的第三方库 陷入了僵局 所以换个口味 把大作业整理一下 Require
  • python入门到精通 _7异常、模块与包

    文章目录 1 异常捕获 1 1 捕获常规异常 1 2 捕获指定异常 1 3 捕获多个异常 1 4 异常的finally 2 模块的导入与自定义 2 1 模块的导入 2 2 模块的自定义 3 安装第三方包与自定义 3 1 自定义包 3 2 安
  • 生成3d地图obj(可导入到ppt中使用)

    一 效果 二 使用 1 网址 https 3d mapper com MAP index php 2 注册 3 使用 创建3D地图 正在生成中 有以下设置功能 截图 管理你的地图
  • 按键松手检测 - 检测是否连续按下

    u8 KEY Scan void static u8 keyup 1 防止检测多次 if keyup KEY0 0 KEY1 0 KEY3 0 delay ms 50 去抖 if KEY0 0 KEY1 0 KEY3 0 keyup 0 i
  • 代码质量有哪些评判标准?

    描述代码质量的词 灵活性 flexibility 可扩展性 extensibility 可维护性 maintainability 可读性 readability 可理解性 understandability 易修改性 changeabili
  • Kruskal算法代码实现

    package com kruskal import java util Arrays public class KruskalCase private int edgeNum 边的个数 private char vertexs 顶点个数