Java实现Kruskal算法

2023-11-16

一,kruskal算法简介

克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与prim算法不同,它的时间复杂度为O(eloge)(e为网中的边数),所以,适合于求边稀疏的网的最小生成树 。

二,实现步骤

部分流程图。

5bc74e4ec3de476faf14372097155081.jpeg

废话不多说,直接上代码,这张图请和代码一并观看,这样便于将图中的每一步找到对应的代码。 

要说的都写在了代码的注释里,请仔细思考并观看。

package TanXing;

public class MyKruskal {

    public static void main(String[] args) {
        //矩阵
        int [][]area = {
                {IM,23,IM,IM,IM,28,36},
                {23,IM,20,IM,IM,IM,1},
                {IM,20,IM,15,IM,IM,4},
                {IM,IM,15,IM,3,IM,9},
                {IM,IM,IM,3,IM,17,16},
                {28,IM,IM,IM,17,IM,25},
                {36,1,4,9,16,25,IM}
        };
        //顶点
        int []a = {1,2,3,4,5,6,7};
        MyKruskal myKruskal = new MyKruskal(a,area);
        myKruskal.kruskal();
    }
    //矩阵
    static int [][]area;
    //顶点
    static int []a;
    //定义一个不可到达量
    static int IM = Integer.MAX_VALUE;
    //边的条数
    static int route;

    //初始化
    MyKruskal(int []a,int [][]area){
        //保存顶点数
        int v = a.length;
        this.a = a;
        this.area = area;
        //请注意这里有个细节;这个初始化矩阵只要去看矩阵的上半或者下半
        //比如说有AB,但还有BA,而我们只需要去计算一条边
        for(int i = 0;i < v;i++){
            for(int j = i + 1;j < v;j++){
                if(area[i][j] != IM){
                    //计算好边的数量
                    route++;
                }
            }
        }
    }
    public void kruskal(){
        //保存最小生成树权值
        int sum = 0;
        int index = 0;
        //保存边的权和起始和终结点;
        int sourceEnd[]  =new int[route];
        //保存边
        IOC2 []ioc2s =getIOC();
        //保存最小生成树
        IOC2 []res = new IOC2[route];
        sortIOC(ioc2s);
        for(int i = 0;i < route;i++){
            int f1 = getPosition(ioc2s[i].startNode);
            int f2 = getPosition(ioc2s[i].endNode);
            //一个点的寻找终点
            int q1 = getEnd(sourceEnd,f1);
            int q2 = getEnd(sourceEnd,f2);
            //如果终结节点不同,就添加进sourceEnd
            //并且将边添加进最小生成树
            if(q1 != q2){
                sourceEnd[q1] = q2;
                res[index++] = ioc2s[i];
            }
        }
        for(int i = 0;i < index;i++){
            System.out.println(res[i]);
        }

    }
    //初始化IOC
    public IOC2[] getIOC(){
        int index = 0;
        IOC2 []bian = new IOC2[route];
        for(int i = 0;i < a.length;i++){
            for(int j = i + 1;j < a.length;j++){
                if(area[i][j] != IM){
                    bian[index++] = new IOC2(a[i],a[j],area[i][j]);
                }
            }
        }
        return bian;
    }
    //冒泡排序(这里不多讲)
    public void sortIOC(IOC2 []ioc2){
        for(int i = 0;i < route - 1;i++){
            for(int j = 0;j < route - i - 1;j++){
                if(ioc2[j].weight >ioc2[j + 1].weight){
                    IOC2 temp =null;
                    temp = ioc2[j + 1];
                    ioc2[j + 1] = ioc2[j];
                    ioc2[j] = temp;

                }
            }

        }
    }
    //获得这个点在序列表中的位置,比如说1节点,他在a[]序列表中的第0位
    public int getPosition(int num){
        for(int i = 0;i < a.length;i++){
            if(a[i] == num){
                return i;
            }
        }
        return -1;
    }
    //这里是整个kruskal算法的精华
    //寻找或者添加一个节点的根节点
    public int getEnd(int []sourceEnd,int p){
        while (sourceEnd[p] != 0){
            p = sourceEnd[p];
        }
        return p;

    }



}

class IOC2{
        int startNode;
        int endNode;
        int weight;

    public IOC2(int startNode, int endNode, int weight) {
        this.startNode = startNode;
        this.endNode = endNode;
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "IOC2{" +
                "startNode=" + startNode +
                ", endNode=" + endNode +
                ", weight=" + weight +
                '}';
    }
}

算法不易,点个赞再走呗!感谢!

 

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

Java实现Kruskal算法 的相关文章

随机推荐

  • C语言学习之assert

    C语言学习之assert C语言学习之assert assert 编程术语 编写代码时 我们总是会做出一些假设 断言就是用于在代码中捕捉这些假设 可以将断言看作是异常处理的一种高级形式 断言表示为一些布尔表达式 程序员相信在程序中的某个特定
  • 【C】变量

    目录 变量的命名 局部变量 全局变量 作用域 生命周期 变量的命名 变量名必须是由字母 数字 下划线组成 不能以数字开头 变量名不能是关键字 局部变量 全局变量
  • 斗地主2.0

    案例介绍 按照斗地主的规则 完成洗牌发牌的动作 具体规则 组装54张扑克牌将 54张牌顺序打乱 三个玩家参与游戏 三人交替摸牌 每人17张牌 最后三张留作底牌 查看三人各自手中的牌 按照牌的大小排序 底牌 规则 手中扑克牌从大到小的摆放顺序
  • git 主干master分支回滚到历史版本

    先切换到主分支 然后执行以下两点 1 回滚到指定版本 本地分支回滚到指定版本 git reset hard
  • 【漏洞复现】CVE-2022-44268 ImageMagick任意文件读取漏洞

    启动环境 sudo docker compose up d 查看端口号 服务启动后 访问http your ip 8080可以看到图片上传框 利用这个漏洞 需要先准备一个恶意PNG文件 文件内容中包含我们准备读取的文件路径 可以使用poc
  • 计算机网络--第三章思维导图

  • document.referrer的用法

    在JavaScript中 document对象有很多属性 其中有3个与对网页的请求有关的属性 它们分别是URL domain和referrer URL属性包含页面完整的URL domain属性中只包含页面的域名 而referrer属性中则保
  • 【模型评估与选择】sklearn.model_selection.train_test_split

    1 描述 Split arrays or matrices into random train and test subsets 2 语法 train test split arrays options 3 参数 1 arrays sequ
  • 多版本php安装swoole失败问题

    问题描述 使用命令 pecl安装报错 查看报错提示使用的是低版本的php 问题原因 pecl设置的环境变量指向的路径是低版本的所以如果想使用高版本的php 需要使用全路径命令 解决方法 usr local php7 26 bin pecl
  • Ubuntu 安装elasticsearch集群

    环境准备 准备三台服务器搭建集群环境 node1 192 168 177 171 node2 192 168 177 172 node3 192 168 177 173 其中node1为master节点 node2 node3为slave节
  • 图像分割汇总

    Image Segmentation 图像分割 所谓图像分割是指根据灰度 彩色 空间纹理 几何形状等特征把图像划分成若干个互不相交的区域 使得这些特征在同一区域内表现出一致性或相似性 而在不同区域间表现出明显的不同 简单的说就是在一副图像中
  • Python——遗传算法简介及其在二次分配中的运用(含详细源代码)

    一 遗传算法简介 二 二次分配问题描述 三 Python代码实现 import math import random import matplotlib pyplot as plt def getPermutation n x n为全排列的
  • 集训第一周 Linux

    1 创建一个用户user1 用root身份给user1修改密码为redhat 提示 创建用户用useradd user1 2 切换到user1用户 给自己修改一个密码 密码任意 3 在 root 目录中创建一个以自己的汉语拼音为名字的文件
  • QML学习一:QtCreator编译器主题背景设置

    效果如下 QML学习一 QtCreator编译器主题背景设置 前言 一 工具栏菜单栏背景设置 二 文本编辑区域设置 总结 前言 工欲善其事必先利其器 为了更好地开发代码 我们先将QtCreator界面改为模仿Vs2019主题样式 这样开发起
  • Unity3d中所有特殊的文件夹

    1 Editor Editor文件夹可以在根目录下 也可以在子目录里 只要名子叫Editor就可以 比如目录 xxx xxx Editor 和 Editor 是一样的 无论多少个叫Editor的文件夹都可以 Editor下面放的所有资源文件
  • svn清理本地已经删除的文件,注意事项

    点击项目目录下空白处点击trotoiseSVN后点击检查修改 在里面删除你想要删除的已删除文件即可 分支操作注意事项 在切换分支前记得提交本地代码的修改 否则会合并到切换后的分支去 切记 哎
  • Java使用MongoTemplate实现多条件、模糊查询、排序、范围、分页查询

    场景 查询客户列表 不同条件之间取交集 且的关系 单个条件内取并集 或的关系 实现细节如下 1 全等于 手机号全字匹配 2 模糊查询 客户名称模糊搜索 3 单个条件查询多个字段 客户编号 4 日期范围 近期消费时间 5 数值范围 消费总金额
  • Ubuntu使用haar+adaboost训练进行手势识别

    手势识别开源代码千千万 为啥我要用此方法 原因有三 首先 我们项目要求这个手势识别是不分环境的 也就是半夜三更黑灯瞎火也能用 这一下子就把纯RGB的方式给去除了 而且也要考虑用户戴手套 手套颜色不限制 使用 那么肤色过滤什么的咱们再见 其次
  • 毕业设计 2023-2024年最新python毕设选题题目推荐汇总

    文章目录 0 前言 1 python 算法类 毕设选题 2 python 数据挖掘 毕设选题 3 python 大数据处理 云计算 区块链 毕设选题 4 python 网络安全 毕设选题 5 python 游戏设计 动画设计类 毕设选题 适
  • Java实现Kruskal算法

    一 kruskal算法简介 克鲁斯卡尔算法是求连通网的最小生成树的另一种方法 与prim算法不同 它的时间复杂度为O eloge e为网中的边数 所以 适合于求边稀疏的网的最小生成树 二 实现步骤 部分流程图 废话不多说 直接上代码 这张图