并查集算法实现

这篇具有很好参考价值的文章主要介绍了并查集算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试链接

牛客测试链接

介绍

并查集(Disjoint Set)是一种用于处理集合合并与查询问题的数据结构。它支持两种操作:合并(Union)和查询(Find)。

合并操作将两个不相交的集合合并为一个集合,查询操作用于判断两个元素是否属于同一个集合。

本文将介绍并查集算法的实现,并给出一个示例代码。

算法实现

import java.util.*;
import java.io.*;

public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static StreamTokenizer sr = new StreamTokenizer(in);
    static int MAXN = (int)(1e6 + 10);
    static int[] f = new int[MAXN];
    static int[] size = new int[MAXN];
    static int[] stack = new int[MAXN];
    static int n, m;

    public static void main(String[] args) throws IOException {
        n = nextInt();
        m = nextInt();
        build();
        while (m-- > 0) {
            int op = nextInt();
            int x = nextInt();
            int y = nextInt();
            if (op == 1) {
                boolean res = isSameSet(x, y);
                out.println(isSameSet(x, y) ? "Yes" : "No");
                out.flush();
            } else if (op == 2) {
                union(x, y);
            }
        }
    }
    static void build() {
        for (int i = 0; i <= n; i++) {
            f[i] = i;
            size[i] = 1;
        }
    }
    static int find(int i) {
        int size = 0;
        while (i != f[i]) {
            stack[size++] = i;
            i = f[i];
        }
        while (size > 0) {
            f[stack[--size]] = i;
        }
        return i;
    }
    static boolean isSameSet(int x, int y) {
        return find(x) == find(y);
    }
    static void union(int x, int y) {
        int fx = find(x);
        int fy = find(y);
        if (fx != fy) {
            if (size[fx] >= size[fy]) {
                size[fx] += size[fy];
                f[fy] = fx;
            } else {
                size[fy] += size[fx];
                f[fx] = fy;
            }
        }
    }
    static int nextInt() throws IOException {
        sr.nextToken();
        return (int)sr.nval;
    }
}

算法解析

  1. 首先,我们定义了一个并查集的大小 MAXN,并声明了一些用于存储数据的数组和变量。
  2. build 方法用于初始化并查集,将每个元素的父节点设置为自身,并将每个集合的大小初始化为 1。
  3. find 方法用于查找元素所属的集合,通过递归地找到根节点,并将路径上的节点的父节点设置为根节点,以优化后续的查找操作。
  4. isSameSet 方法用于判断两个元素是否属于同一个集合,通过比较它们的根节点是否相同来判断。
  5. union 方法用于合并两个集合,首先找到两个元素所属的根节点,然后根据集合的大小来决定合并的方式,将一个集合的根节点指向另一个集合的根节点,并更新集合的大小。
  6. main 方法中,我们首先读取输入的元素个数 n 和操作次数 m,然后调用 build 方法初始化并查集。
  7. 接下来,根据操作类型进行相应的操作。如果是查询操作,我们调用 isSameSet 方法判断两个元素是否属于同一个集合,并输出结果。如果是合并操作,我们调用 union 方法合并两个集合。
  8. 最后,我们输出结果并结束程序。

总结

本文介绍了并查集算法的实现,并给出了一个示例代码。并查集是一种用于处理集合合并与查询问题的数据结构,它的核心思想是通过维护每个元素的父节点来表示集合之间的关系。通过路径压缩和按秩合并等优化策略,可以提高并查集算法的效率。

希望本文对你理解并查集算法有所帮助!文章来源地址https://www.toymoban.com/news/detail-822540.html

到了这里,关于并查集算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】并查集的简单实现,合并,查找(C++)

    需要将n个不同的元素 划分成一些不相交的集合 。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。 学生小

    2024年02月04日
    浏览(50)
  • 数据结构---并查集

    这里可以使用生活中的一个例子来带着大家理解并查集,大家在上学的过程中肯定会发现一种现象,在开学之前大家谁也不认识谁每个人都是一个小团体,可是开学之后因为座位旁边有一个同桌,所以开学没多久你和同桌就会互相认识并且开心的玩在一起,那么这时就是两个

    2024年02月15日
    浏览(42)
  • 高阶数据结构 ——— 并查集

    并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。 并查集通常用森林来表示,森林中的每棵树表示一个集合,树中的结点对应一个元素。 说明一下: 虽然利用其他数据结构也能完成不相交集合的合并及查询,但在数据量极大的情况下,其耗费的时

    2024年02月03日
    浏览(53)
  • 【数据结构】--并查集

    目录 一、概念 ​编辑 二、应用场景--“连接”问题(属于同一Qu 三、实现思路  四、如何存储数据 五、定义接口 1.初始化(init) 2.其他 isSame() 六、抽象类 六、Quick Find【v1 所在集合的所有元素都指向 v2 的根节点】 1.Union 1.Union图解 2.注意点:  3.代码实现 2.find  1.find图

    2023年04月09日
    浏览(33)
  • 【数据结构】并查集

    并查集是简单的数据结构,学会并查集,为图打好基础。 是树状的数据结构,用于处理相交集合的合并与查询 通常用森林表示,一片森林表示一个集合 并查集一般需要完成 查找元素属于哪个集合 查看两个元素是否属于同一个集合 将两个集合归并成一个集合 集合的个数 假

    2024年02月19日
    浏览(36)
  • 【高阶数据结构】——并查集

    在一些应用问题中, 需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合, 然后按一定的规律将归于同一组元素的集合合并 。在此过程中要 反复用到查询某一个元素归属于那个集合的运算 。适合于描述这类问题的抽象数据类型称为 并查集

    2024年02月16日
    浏览(37)
  • 数据结构--并查集

    所有元素的全集s 将各个元素划分为若干个互不相交的子集 用一个数组S[ ]即可表示“集合”关系 集合的两个基本操作―— “并” color{red}“并” “ 并 ” 和 “查” color{red}“查” “ 查 ” Find -—“查”操作:确定一个指定元素所属集合 Union --“并”操作:将两个不想交的集

    2024年02月15日
    浏览(36)
  • 数据结构详细笔记——并查集

    集合:将各个元素划分为若干个互不相交的子集的集合 森林是m(m=0)棵互不相交的树的集合 优化思路:在每次Union操作构建树的时候,尽可能让树不长高 ①用根结点的绝对值表示树的结点的总数 ②Union操作,让小树合并到大树 优化思路:先找到根结点,再将查找路径上所有结

    2024年02月06日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包