java并查集算法带你领略热血江湖

Java并查集算法带你领略热血江湖

什么是并查集

并查集是一种用于管理不相交集合(并查集中,“集合”通常是指一个性质相同的元素的集合)的数据结构。它支持在并集、查集两个操作中的任何一个在接近O(1)的时间复杂度完成,且相对简单易懂。

并查集的应用场景

  1. 网络的连通性判断
  2. 最小生成树算法
  3. 图像处理领域的一些应用

并查集的基本操作

  1. 初始化:每个元素都由自己单独构成一个集合,每个集合的父节点设置成自己;
  2. 查找:判断某个元素所在的集合,可以通过不断地向上查找父节点,直到其父节点是自身。
  3. 合并:将两个集合合并为一个,将其中一个的父节点设置为另一个的根节点。

Java并查集算法示例

示例一:判断一个图是否连通

public class ConnectedComponent {
    private int[] father; // 记录每个点的父节点
    private int count; // 连通块数量

    /**
     * 初始化并查集
     * @param n 节点个数
     */
    public ConnectedComponent(int n) {
        father = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            father[i] = i;
        }
        count = n;
    }

    /**
     * 查询节点所在的连通块
     * @param x 节点编号
     * @return 节点所在的连通块代表
     */
    public int find(int x) {
        if (father[x] == x) {
            return x;
        }
        return father[x] = find(father[x]); // 路径压缩
    }

    /**
     * 合并两个连通块
     * @param x 节点 x
     * @param y 节点 y
     * @return true:合并成功;false:两个点已经在同一个连通块中
     */
    public boolean union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX == rootY) {
            return false;
        }
        father[rootX] = rootY;
        count--;
        return true;
    }

    /**
     * 获取连通块数量
     * @return 连通块数量
     */
    public int getCount() {
        return count;
    }
}

示例二:计算朋友圈数量

给定一个类似于人际关系的矩阵,其中1表示两个人是朋友,0表示不是,计算朋友圈的数量。

public class FriendCircle {
    private int[] father;
    private int count;

    /**
     * 初始化并查集
     */
    public FriendCircle(int n) {
        father = new int[n];
        for (int i = 0; i < n; i++) {
            father[i] = i;
        }
        count = n;
    }

    /**
     * 查找节点所在连通块的代表
     * @param x 节点编号
     * @return 联通块代表
     */
    private int find(int x) {
        if (father[x] == x) {
            return x;
        }
        return father[x] = find(father[x]);
    }

    /**
     * 合并两个节点所在的连通块
     * @param x 节点x
     * @param y 节点y
     */
    private void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX == rootY) {
            return;
        }
        father[rootX] = rootY;
        count--;
    }

    /**
     * 计算朋友圈数量
     * @param M 人际关系矩阵
     * @return 朋友圈数量
     */
    public int findCircleNum(int[][] M) {
        for (int i = 0; i < M.length; i++) {
            for (int j = i + 1; j < M[0].length; j++) {
                if (M[i][j] == 1) {
                    union(i, j);
                }
            }
        }
        return count;
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java并查集算法带你领略热血江湖 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 解决fastjson泛型转换报错的解决方法

    解决fastjson泛型转换报错的解决方法 问题描述: fastjson是Java中一个非常常用的JSON处理库,其中序列化和反序列化功能特别强大,但在使用其进行泛型反序列化时,会出现“com.alibaba.fastjson.JSONException: parse error”等异常,这就涉及到fastjson泛型转换错误的问题。 解决方法: 解决这个问…

    Java 2023年5月26日
    00
  • 基于@JsonFormat的导包问题

    接下来我会为你详细讲解“基于@JsonFormat的导包问题”的完整攻略。 1. 理解@JsonFormat注解 在讲解导包问题之前,我们首先要理解 @JsonFormat 注解的作用。它是一个Jackson库中的注解,用于控制序列化和反序列化日期格式。可以将其应用于Java类或字段上。@JsonFormat注解有多种属性可以调整日期格式,例如可以设置 pa…

    Java 2023年5月26日
    00
  • SpringBoot文件上传同时接收复杂参数的过程详解

    以下是SpringBoot文件上传同时接收复杂参数的过程详解,包含两条示例。 1. 前置条件 在使用SpringBoot进行文件上传和接收复杂参数之前,需要完成以下步骤: 确定上传文件的存储路径 添加SpringBoot的web和文件上传依赖项 配置multipart文件上传限制 在完成上述步骤后,我们可以开始编写文件上传和接收复杂参数的代码了。 2. 实现…

    Java 2023年5月19日
    00
  • 安全管理器的作用是什么?

    安全管理器是一种可以用来管理Java应用程序中的安全策略的类,它可以控制应用程序访问受限资源的权限。在Java应用程序中,安全管理器主要用于保护操作系统的安全和避免恶意代码的攻击。 安全管理器主要有以下作用: 对于受保护的代码块进行管理和控制 安全管理器可以用来管理和控制Java应用程序中的受保护的代码块或敏感操作,例如文件读写操作、网络访问和反射调用。如果…

    Java 2023年5月11日
    00
  • Java基础之常用的命令行指令

    Java基础之常用的命令行指令 在使用Java开发中,经常需要在命令行中执行一些操作,例如编译、运行Java程序等。下面是常用的命令行指令及其作用。 javac javac是Java编译器,可以将Java源代码编译成Java字节码文件(.class文件)。使用方法如下: javac HelloWorld.java 上述指令将会编译HelloWorld.jav…

    Java 2023年5月19日
    00
  • java异步调用的4种实现方法

    Java异步调用的4种实现方法 1. 回调函数 回调函数是一种异步调用的解决方案之一,在Java中可以通过接口来实现回调函数。 具体实现方式是定义一个接口,在异步任务完成后调用接口的方法,将需要传递的数据传递给回调函数,执行回调函数完成后续逻辑处理。 如下是一个简单的示例: public interface Callback{ void onComplete…

    Java 2023年5月18日
    00
  • 基于IDEA创建SpringMVC项目流程图解

    下面是基于IDEA创建SpringMVC项目的完整攻略流程图解: 前置条件 安装JDK和IDEA 熟悉Java和SpringMVC开发 创建SpringMVC项目 启动IDEA,点击“Create New Project”来创建新项目 选择“Spring Initializr”来创建SpringMVC项目 在“New Project”窗口中,选择“Sprin…

    Java 2023年5月16日
    00
  • SpringMVC RESTful支持实现过程演示

    SpringMVC RESTful是一种基于HTTP协议进行通信的WebService框架,它可以帮助开发者快速构建符合RESTful风格的Web应用程序。下面我们将详细讲解如何在SpringMVC中实现RESTful支持,并附带两个示例说明。 实现过程 1. 配置SpringMVC 首先,我们需要在web.xml中配置DispatcherServlet,以…

    Java 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部