并查集算法详解

文章目录

    • 并查集概念
    • 并查集的常见操作
      • 构建并查集
      • 合并并查集和查找
    • 关于find函数

并查集概念

并查集(Union-Find)是一种树型的数据结构,用于处理一些不交集的合并及查询问题。其主要应用是判断两个元素是否在同一个集合中,以及合并两个集合。

并查集的常见操作

构建并查集

public class Main12 
{public static void main(String[] args) {int[] father=new int[11];for(int i=1;i<=10;i++){father[i]=i;}}
}

这样构建的数组的每一个元素都是一个单独的集合没有任何交集。
就像这样
在这里插入图片描述

合并并查集和查找

public class Main12
{static int[] father=new int[11];public static void main(String[] args) {for(int i=1;i<=10;i++){father[i]=i;}father[find(1)]=find(2);father[find(3)]=find(2);father[find(2)]=find(4);}public static int find(int x){while(x!=father[x]){x=father[x];}return father[x];}
}

father数组里面存是当前元素的父节点,看个图片就理解了。
find函数是查找元素的根节点
以这个并查集为例子:
father[find(1)]=find(2);
father[find(3)]=find(2);
father[find(2)]=find(4);

在这里插入图片描述
我们先将集合1合并到集合2,再将集合3合并到集合2,最后将集合2合并到集合4。
集合的合并:例如合并集合1和集合2 father[find(1)]=find(2);就是将2的根节点赋值给1的根节点就可以了

在这里插入图片描述
看这幅图片就可以很好理解father数组里面存是当前元素的父节点
在并查集里面只有根节点的x==[father[x],通过这个特点我们可以查找集合元素的根节点,当两个元素根节点相同时则属于同一个集合,否则就不在同一集合。

关于find函数

public static int find(int x){while(x!=father[x]){x=father[x];}return father[x];}

我们以这种写法找根节点的时候如果我们查找n-1元素的根节点的时候需要将整棵树遍历一遍效率比较低。
在这里插入图片描述
find的第二种写法

 public static int find(int x){if(father[x]!=x){father[x]=find(father[x]);}return father[x];}

这种写法有个名字叫路径压缩,效率高,但是有个缺点就是会破坏树的结构。
举个例子:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
看第一幅图我们可以知道1的父节点应该是2,但是如果使用路径压缩,1的父节点被修改为了1。意味着树的结构变为了这样
在这里插入图片描述
大家根据具体的需要选择合适的find方法。
并查集模板练习

import java.util.Scanner;
public class Main
{static int N,M;static int[] arr;public static void main(String[] args) {Scanner scanner=new Scanner(System.in);N=scanner.nextInt();M=scanner.nextInt();arr=new int[N+10];for(int i=1;i<=N;i++){arr[i]=i;}while((M--)>0){int z=scanner.nextInt();int x=scanner.nextInt();int y=scanner.nextInt();if(z==1){arr[find(x)]=find(y);}else{if(find(x)==find(y)){System.out.println("Y");}else{System.out.println("N");}}}}static int find(int x) {if (x != arr[x]) arr[x] = find(arr[x]);return arr[x];}
}

村村通题目练习

import java.util.Scanner;
public class Main
{static int N,M;static int[] arr;public static void main(String[] args) {Scanner scanner=new Scanner(System.in);N=scanner.nextInt();M=scanner.nextInt();arr=new int[N+10];for(int i=1;i<=N;i++){arr[i]=i;}while((M--)>0){int z=scanner.nextInt();int x=scanner.nextInt();int y=scanner.nextInt();if(z==1){arr[find(x)]=find(y);}else{if(find(x)==find(y)){System.out.println("Y");}else{System.out.println("N");}}}}static int find(int x) {if (x != arr[x]) arr[x] = find(arr[x]);return arr[x];}
}

完。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

新书速览|Java网络爬虫精解与实践

《Java网络爬虫精解与实践》 本书内容 《Java网络爬虫精解与实践》全面而系统地介绍与网络爬虫程序相关的理论知识&#xff0c;并包含大量的实践操作案例。 《Java网络爬虫精解与实践》共分为 8 章。第 1 章以自动化框架为基础&#xff0c;介绍网络爬虫程序的入门开发实践。第…

多模态大模型微调实践!PAI+LLaMA Factory搭建AI导游

一、引言 AI的快速发展推动了各行各业的智能化转型和创新&#xff0c;随之而来的是对AI应用的迫切需求。 如何微调大模型、高效搭建AI应用成为了开发者们广泛关注的技术方向。阿里云人工智能平台PAI&#xff0c;联合开源低代码大模型微调框架LLaMA Factory &#xff0c;共同打…

提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)

文章目录 阿里公共 DNS 介绍免费开通云解析 DNS 服务Windows 编辑 DNS 设置配置 IPv4配置 IPv6 路由器配置 DNS 阿里公共 DNS 介绍 https://alidns.com/ 免费开通云解析 DNS 服务 https://dnsnext.console.aliyun.com/pubDNS 开通服务后&#xff0c;获取 DOH 模板&#xff0…

[C语言]strstr函数的使用和模拟实现

1.strstr函数的使用 char * strstr ( const char *str1, const char * str2); 返回一个指向str1中str2第一次出现的指针&#xff0c;如果str2中没有str1则返回 NULL。。 实例&#xff1a; #include <stdio.h> #include <string.h> int main() {char str[] "…

【HTML】——VSCode 基本使用入门和常见操作

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;HTML开发工具VSCode的使用 1&#xff1a;创建项目 2&#xff1a;创建格式模板&#x…

区块链的安全性与透明性:Web3如何重塑信任机制

在数字化时代的浪潮中&#xff0c;信任机制的建立显得尤为重要。随着Web3的崛起&#xff0c;区块链技术以其独特的安全性与透明性&#xff0c;正在重塑我们对信任的理解。区块链不仅为去中心化的互联网架构提供了基础&#xff0c;还通过加密技术和分布式账本&#xff0c;实现了…

[OS] Assignment 3-VM

虚拟机设置 虚拟机登录与使用说明 因为项目3基于 xv6 系统运行&#xff0c;它需要一系列支持工具链。我们已经为您准备好了所有必要的环境。 我们提供了 CSC3150_a3_xv6.ova 文件供 x64 架构 用户使用&#xff08;可以导入到 VirtualBox 或 VMware 中&#xff09;&#xff0…

Redis 位图实现签到之长时间未签到预警

#目前通行系统项目中有一个新需求【通过对通行记录数据定时分析&#xff0c;查询出长时间没 有刷卡/刷脸通行的学生】 #一看到通行签到相关&#xff0c;就想到了redis的位图&#xff0c;理由也有很多帖子说明了&#xff0c;最大优点占用空间小。 一.redis命令行 SETBIT&#…

java 多态

1.认识多态 class animals{String name"animals";public void run(){} } class cat extends animals{String name"cat";Overridepublic void run(){System.out.println("cat run");} } class dog extends animals{String name"dog";Ov…

Android TextView自动换行文本显示不全解决

某些情况下&#xff0c;TextView自动换行后&#xff0c;会出现每行结尾处显示不全的问题&#xff0c; 如图&#xff1a; 常见解决方案&#xff1a; 设置TextView的“ellipsize”属性为“end” 实测无效&#xff01;将TextView外部的Layout改为RelativeLayout 实测无效&…

基于springboot+vue实现的养老院管理系统(源码+L文+ppt)

基于springbootvue实现的养老院管理系统&#xff08;源码L文ppt&#xff09;4-106 养老院系统管理是一个综合性养老在线平台&#xff0c;旨在综合并简化养老机构中的照护流程。该系统集成了多种功能&#xff0c;以支持医生、护士、家属及管理员等不同角色的需求。对于医务人员而…

智慧城市的守护者——智能井盖监测终端

城市化进程的加速推进使得基础设施建设成为提升城市品质的关键环节。然而&#xff0c;在这一进程中&#xff0c;市政公用设施中的井盖与地下线缆的安全问题却日益凸显。由于缺乏有效的实时监控与管理体系&#xff0c;给犯罪分子留下了可趁之机&#xff0c;频繁发生的井盖被盗及…

uniApp之uni-file-picker使用踩坑

标题党~也不算坑吧 就是初体验 上传是需要存储一下子的&#xff0c;我以为uniApp是自己免费开的服务给大家中转使用&#xff0c;就没管这个事&#xff0c;但是官网是这么说的&#xff1a; 就我是怎么发现的&#xff0c;使用了一段时间后&#xff0c;上传的图片都裂了&#xff…

动态规划理论基础和习题【力扣】【算法学习day.23】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

Docker:介绍与安装

Docker官网与仓库地址 docker官网&#xff1a;http://www.docker.comopenDocker Hub官网: https://hub.docker.com/open Docker三要素 镜像 (Image) 镜像是Docker的核心概念之一&#xff0c;它是不可变的、只读的&#xff0c;并包含了一套文件系统&#xff0c;里面包含了运…

基于SpringBoot的微信小程序学生运动打卡系统【附源码】

基于SpringBoot的微信小程序学生运动打卡系统 效果如下&#xff1a; 系统主页面 论坛页面 登陆页面 我的页面 系统登录页面 管理员主页面 公告信息页面 研究背景 随着数字化时代的到来&#xff0c;大学生的生活节奏日益加快&#xff0c;学习压力与社交活动并行不悖。如何在繁…

【go从零单排】go中的nil到底是啥意思?

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 nil 在Go语言中&#xff0c;nil 是一个预定义的标识符&#xff0c;用于表示指针、切片、映射、通道、接口和函数的…

forEach可以遍历不可枚举属性吗

首先第一个问题,forEach能不能遍历对象的属性 const obj { a: 1, b: 2, c: 3 }; obj.forEach((item) > console.log(item))运行这段代码我们发现发生了一个错误 这说明forEach是不可以遍历对象的属性的 在js中,forEach 方法用于遍历数组或类数组对象&#xff08;如 NodeL…

书生大模型实战营第四期-入门岛-1. Linux前置基础

入门岛-Linux前置基础 书生大模型实战营-第四期-Linux前置基础&#xff1a; 任务&#xff1a;https://github.com/InternLM/Tutorial/blob/camp4/docs/L0/linux/task.md 文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux 任务描述完成所需时…

Webserver(4.9)本地套接字的通信

目录 本地套接字 本地套接字 TCP\UDP实现不同主机、网络通信 本地套接字实现本地的进程间的通信&#xff0c;类似的&#xff0c;一般采用TCP的通信流程 生成套接字文件 #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h&…