首页 > 试题广场 >

并查集的实现

[编程题]并查集的实现
  • 热度指数:5600 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个没有重复值的整形数组arr,初始时认为arr中每一个数各自都是一个单独的集合。请设计一种叫UnionFind的结构,并提供以下两个操作。
  1. boolean isSameSet(int a, int b): 查询a和b这两个数是否属于一个集合
  2. void union(int a, int b): 把a所在的集合与b所在的集合合并在一起,原本两个集合各自的元素以后都算作同一个集合
[要求]
如果调用isSameSet和union的总次数逼近或超过O(N),请做到单次调用isSameSet或union方法的平均时间复杂度为O(1)

输入描述:
第一行两个整数N, M。分别表示数组大小、操作次数
接下来M行,每行有一个整数opt
若opt = 1,后面有两个数x, y,表示查询(x, y)这两个数是否属于同一个集合
若opt = 2,后面有两个数x, y,表示把x, y所在的集合合并在一起


输出描述:
对于每个opt = 1的操作,若为真则输出"Yes",否则输出"No"
示例1

输入

4 5
1 1 2
2 2 3
2 1 3
1 1 1
1 2 3

输出

No
Yes
Yes

说明

每次2操作后的集合为
({1}, {2}, {3}, {4})
({1}, {2, 3}, {4})
({1, 2, 3}, {4})

备注:

头像 华科不平凡
发表于 2020-09-07 10:41:00
我以前也不会呀,自从用了并查集之后,嗨,效果还真好!我们全家都用它!——某大佬 关于并查集,有以下题型: LeetCode130——Surrounded Regions——给了个二维 grid,把里面O全部变成X,但是边界和边界联通区域内的O保留(也能用DFS) LeetCode261——Gra 展开全文
头像 haoming爱刷题
发表于 2024-05-03 22:13:51
#include<iostream> #include<vector> #include<cmath> #include<algorithm> #include<stack> using namespace std; const int N 展开全文
头像 sticking
发表于 2023-10-05 16:45:06
import java.io.*; /** * ClassName: Code * pACKAGE: UnionLookUpSet * Description: * 并查集相关代码的实现 * 平均时间复杂度:o(1) * @Author hz * @Create: 2023/10/4 展开全文
头像 WYJ96
发表于 2021-08-15 00:13:15
public class h9a14 { static public int[] p;//根节点 static public int[] rank;//秩 public static void init(int n) { //初始化p[i]:第i个集合的根节 展开全文
头像 Plumz
发表于 2024-03-16 12:43:15
初始化:自己指向自己合并:合并操作都发生在根上判连通:父节点相同,则连通 class UnionFind { vector<int> pre; public: UnionFind(int n) { pre.resize(n); for(in 展开全文
头像 守re
发表于 2024-11-24 18:16:58
#include <bits/stdc++.h> using namespace std; const int MAXN = 1000001; int father[MAXN]; // 每个节点的父节点 int group_size[MAXN]; // 每个集合的大小 int 展开全文

问题信息

上传者:小小
难度:
27条回答 6514浏览

热门推荐

通过挑战的用户

查看代码
并查集的实现