最小生成树(Java实现)

一、Prim算法

        Prim算法基本思想为:从联通网络 N={V,E}中某一顶点 v0 出发,此后就从一个顶点在 S 集中, 另一个顶点不在 S 集中的所有顶点中选择出权值最小的边,把对应顶点加入到 S 集 中, 直到所有的顶点都加入到 S 集中为止。

原始图:

最小生成树:

package algorithm;

public class prim {
    public static void main(String[] args) {
        char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
        int num = vertex.length;
        int[][] edge = {//10000表示两个顶点不通
                {10000, 5, 7, 10000, 10000, 10000, 2},
                {5, 10000, 10000, 9, 10000, 10000, 3},
                {7, 10000, 10000, 10000, 8, 10000, 10000},
                {10000, 9, 10000, 10000, 10000, 4, 10000},
                {10000, 10000, 8, 10000, 10000, 5, 4},
                {10000, 10000, 10000, 4, 5, 10000, 6},
                {2, 3, 10000, 10000, 4, 6, 10000}};

        MGraph mGraph = new MGraph(num);
        MinTree minTree = new MinTree();
        minTree.creatGraph(mGraph, num, vertex, edge);
        minTree.showGraph(mGraph);
        minTree.prim(mGraph, 0);
    }
}


class MGraph {
    int num; //顶点的个数
    char[] vertex; //顶点的元素
    int[][] edge; //存放边

    public MGraph(int num) { //构造器
        this.num = num;
        vertex = new char[num];
        edge = new int[num][num];
    }
}

class MinTree {
    //创建图
    public void creatGraph(MGraph mGraph, int num, char[] vertex, int[][] edge) {
        for (int i = 0; i < num; i++) {
            mGraph.vertex[i] = vertex[i]; //添加每个顶点的名字
            for (int j = 0; j < num; j++) {
                mGraph.edge[i][j] = edge[i][j]; //添加各个城市之间直接相连的边的权值
            }
        }
    }

    //普利姆算法
    public void prim(MGraph mGraph, int node) {
        int[] vis = new int[mGraph.num]; //用于标记遍历过的节点
        vis[node] = 1; //将当前节点标记为1表示已访问
        //用来记录最小路径中两个节点的下标
        int index1 = -1;
        int index2 = -1;
        for (int k = 1; k < mGraph.num; k++) { //若有n个节点 则有n - 1 条边
            int minSide = Integer.MAX_VALUE; //遍历与之比较 找到最小的路径
            for (int i = 0; i < mGraph.num; i++) {
                for (int j = 0; j < mGraph.num; j++) {
                    if (vis[i] == 1 && vis[j] == 0 && mGraph.edge[i][j] < minSide) {
                        minSide = mGraph.edge[i][j]; //最短边上的权值
                        //最短边的两个顶点
                        index1 = i;
                        index2 = j;
                    }
                }
            }
            //从第内层for循环出来后,表示找到一条最短边
            System.out.println("边<" + mGraph.vertex[index1] + "," + mGraph.vertex[index2] + ">权值:" + minSide);
            vis[index2] = 1; //将最内层与已访问节点路径最短的节点设置为已访问
        }
    }

    //输出初始图
    public void showGraph(MGraph mGraph) {
        for (int[] arr : mGraph.edge) {
            for (int element : arr) {
                System.out.print(element + " ");
            }
            System.out.println();
        }
    }
}

二、Kruskal算法

        kruskal其基本思想为:设有一个有 N 个顶点的联通网络 N={V,E},初始时建立一个只有 N 个顶点且没有边的非连通图 T,T 中每个顶点都看作是一个联通分支,从边集 E 中选择出权值最小的边且该边的两个端点不在一个联通分支中,则把该边加入到 T 中,否则就再从E新选择一条权值最小的边,直到所有的顶点都在一个联通分支中为止。

package algorithm;

import java.util.*;
/*
1. 定义一个并查集类,用于判断两个顶点是否属于同一个连通分量
2. 对图中的所有边按照权重进行排序
3. 遍历排序后的边,如果边的两个顶点不属于同一个连通分量,则将这条边加入最小生成树中,并将这两个顶点所在的连通分量合并
4. 重复步骤3,直到最小生成树中的边数等于顶点数减1
*/

class UnionFind {
    int[] parent;//存储每个结点的前驱结点
    int[] rank;//树的高度

    public UnionFind(int n) {
        parent = new int[n];
        rank = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;//每个结点的上级都是自己
            rank[i] = 1;//每个结点构成的树的高度为1
        }
    }

    public int find(int x) {
        if (parent[x] == x) {//递归出口:x的上级为 x本身,即 x为根结点
            return x;
        }
        return parent[x] = find(parent[x]);//此代码相当于先找到根结点 rootx,然后 parent[x]=rootx
    }

    public boolean union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX == rootY) {
            return false;
        }
        if (rank[rootX] > rank[rootY]) {
            parent[rootY] = rootX;
        } else if (rank[rootX] < rank[rootY]) {
            parent[rootX] = rootY;
        } else {
            parent[rootY] = rootX;
            rank[rootX]++;
        }
        return true;
    }
}

class Edge implements Comparable<Edge> {
    int from;
    int to;
    int weight;

    public Edge(int from, int to, int weight) {
        this.from = from;
        this.to = to;
        this.weight = weight;
    }

    @Override
    public int compareTo(Edge other) {
        return this.weight - other.weight;
    }
}

public class KruskalAlgorithm {
    public static void main(String[] args) {
        int[][] graph = {
                {0, 1, 5},
                {0, 2, 7},
                {0, 6, 2},
                {1, 6, 3},
                {1, 3, 9},
                {2, 4, 8},
                {3, 5, 4},
                {4, 5, 5},
                {4, 6, 4},
                {5, 6, 6},
        };
        List<Edge> edges = new ArrayList<>();
        for (int[] edge : graph) {
            edges.add(new Edge(edge[0], edge[1], edge[2]));
        }
        Collections.sort(edges);
        UnionFind uf = new UnionFind(graph.length);
        List<Edge> result = new ArrayList<>();
        for (Edge edge : edges) {
            if (uf.union(edge.from, edge.to)) {
                result.add(edge);
            }
        }
        System.out.println("最小生成树的边为:");
        for (Edge edge : result) {
            System.out.println(edge.from + " - " + edge.to + " : " + edge.weight);
        }
    }
}

原始图:

最小生成树:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

D-Tale SSRF漏洞复现(CVE-2024-21642)

0x01 产品简介 D-tale 是一个在 2020 年 2 月推出的库, 是 Pandas 数据结构的可视化工具。它具有许多功能,对于探索性数据分析非常方便、支持交互式绘图、3d 绘图、热图、特征之间的相关性、构建自定义列等等。 0x02 漏洞概述 D-Tale 是 Pandas 数据结构的可视化工具。3.9…

swift基础语法

swift学习笔记 参考教程 https://www.runoob.com/swift/swift-data-types.html swift代码规范 https://juejin.cn/post/7129465308376465422 1 环境搭建 必须要有苹果电脑且安装Xcode 2 基本语法 Swift是类型安全的语言&#xff0c;编译时会进行类型检查 import Cocoa var m…

Git学习笔记(第7章):IDEA实现Git操作(VSCode)

目录 7.1 配置忽略文件 7.2 初始化本地库 7.3 添加暂存区、提交本地库 7.4 修改文件 补充&#xff1a;工具栏简介 7.1 配置忽略文件 问题引入 在版本控制系统中&#xff0c;有些文件或目录是不需要纳入版本管理的&#xff0c;比如编译产生的临时文件、日志文件、缓存文件等…

基于springboot+vue的网上购物商城(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

hugo的常规使用操作

hugo的常规使用操作&#xff08;不断完善中&#xff09; 找到theme主题中config.toml 一般都会通过theme中复制到自己项目的config.toml中做修改和补充&#xff0c;来完善不同的业务需求 Hugo静态资源载入逻辑 原理 将图片信息放到static中&#xff0c;但是在文章中写的时…

电脑存储位置不够怎么办

电脑内存不够怎么办&#xff01;&#xff01;&#xff01; 我前段时间经常因为电脑D盘内存不够而苦恼&#xff08;毕竟电脑内存就那么丁点&#xff0c;C盘作为系统盘不能随便下东西的情况下&#xff0c;就只能选择其他盘进 方法一&#xff1a;检查电脑硬盘的分区情况&#xf…

Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案

2018年&#xff0c;我们开始在原生RTSP|RTMP直播播放器的基础上&#xff0c;对接了Unity环境下的低延迟播放&#xff0c;毫秒级延迟&#xff0c;发布后&#xff0c;就得到了业内一致的认可。然后我们覆盖了Windows、Android、iOS、Linux的RTMP推送、轻量级RTSP服务和RTSP|RTMP播…

《WebKit 技术内幕》学习之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程&#xff1a;首先检测事件发生处的元素有无监听者&#xff0c;如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件&#xff08;浏览器对于有些事件必须响应…

BGP Local-preferenct 、AS-Path、 Origin 综合选路实验

Local-preference&#xff1a; 本地优先级&#xff0c;公认任意&#xff0c;仅能在 AS 内使用&#xff08;IBGP内传递&#xff09;&#xff0c;不能在EBGP传递&#xff0c;默认值 100&#xff0c;越大越优。用于离开本 AS &#xff0c;在 IBGP 的入、出方向都可使用&#xff0c…

双端Diff算法

双端Diff算法 双端Diff算法指的是&#xff0c;在新旧两组子节点的四个端点之间分别进行比较&#xff0c;并试图找到可复用的节点。相比简单Diff算法&#xff0c;双端Diff算法的优势在于&#xff0c;对于同样的更新场景&#xff0c;执行的DOM移动操作次数更少。 简单 Diff 算法…

光学期刊1

光学领域的你&#xff0c;如何评价最近发布的光学期刊分区&#xff1f; 如题&#xff0c;附分区表 20240122 知乎 同样先写结论&#xff1a;时代变了&#xff0c;发国产没错的。参考light当年开局多艰难&#xff0c;被各种diss口碑差&#xff0c;很多投一区守门员不中的也…

二进制部署高可用k8s集群V1.20.11版本

文章目录 一、操作系统初始化配置&#xff08;所有节点均执行&#xff09;1、关闭防火墙2、关闭selinux3、关闭swap4、根据规划修改主机名5、在master节点上添加host6、将桥接的IPv4流量传递到iptables的链7、时间同步 二、部署Etcd集群1、准备cfssl证书生成工具2、生成Etcd证书…

2024年软件测试面试题大全【含答案】

Part1 1、你的测试职业发展是什么&#xff1f;【文末有面试文档免费领取】 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做…

tableau mysql 驱动安装

最便捷&#xff0c;最快速的方式。 整体流程&#xff1a;首先得知道你电脑mysql的版本&#xff0c;然后去官网下载ODBC驱动。 mysql版本&#xff1a;浏览器搜一些。 高版本驱动应该是兼容低版本的。 ODBC驱动&#xff1a; 选择第一个&#xff0c;下载&#xff0c;直接msi安装…

学习笔记之 机器学习之预测雾霾

文章目录 Encoder-DecoderSeq2Seq (序列到序列&#xff09; Encoder-Decoder 基础的Encoder-Decoder是存在很多弊端的&#xff0c;最大的问题就是信息丢失。Encoder将输入编码为固定大小的向量的过程实际上是一个“信息有损的压缩过程”&#xff0c;如果信息量越大&#xff0c;…

POKT Network (POKT) :进军百亿美元市场规模的人工智能推理市场

POKT Network&#xff08;又称 Pocket Network&#xff09;是一个去中心化的物理基础设施网络&#xff08;DePIN&#xff09;&#xff0c;它能够协调并激励对任何开放数据源的访问&#xff0c;最初专注于向应用程序和服务提供商提供区块链数据。 自 2020 年主网上线以来&#x…

MSG3D

论文在stgcn与sta-lstm基础上做的。下面讲一下里面的方法&#xff1a; 1.准备工作 符号。这里是对符号进行解释。 一个人体骨骼图被记为G(v,E) 图卷积&#xff1a; 图卷积定义 考虑一种常用于处理图像的标准卷积神经网络 (CNN)。输入是像素网格。每个像素都有一个数据值向…

大数据开发之电商数仓(hadoop、flume、hive、hdfs、zookeeper、kafka)

第 1 章&#xff1a;数据仓库 1.1 数据仓库概述 1.1.1 数据仓库概念 1、数据仓库概念&#xff1a; 为企业制定决策&#xff0c;提供数据支持的集合。通过对数据仓库中数据的分析&#xff0c;可以帮助企业&#xff0c;改进业务流程、控制成本&#xff0c;提高产品质量。 数据…

网络:FTP

1. FTP 文件传输协议&#xff0c;FTP是用来传输文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 2. 特点 明文传输。 作用&#xff1a;可以从服务器上下载文件&#xff0c;或将本地文件上传到服务器。 3. FTP原理 FTP有控制层面…

Java技术栈 —— JVM虚拟机

JVM虚拟机 一、字节码(Byte-Code)1.1 如何查看字节码&#xff1f;1.2 如何理解字节码的作用&#xff1f; 二、JVM内存模型&#xff08;极其重点&#xff0c;必须牢牢把握住&#xff09;2.1 方法区2.2 虚拟机栈2.3 本地方法栈2.4 堆2.5 程序计数器2.6 面试必问 三、GC机制四、JV…