并查集(蓝桥杯 C++ 题目 代码 注解)

目录

介绍:

模板:

题目一(合根植物):

代码:

题目二(蓝桥幼儿园): 

代码:

题目三(小猪存钱罐):

代码:

题目四(星球大战):

代码:​​​​​​​

介绍:

并查集(Disjoint-set Data Structure),也称为不相交集合数据结构,用于解决集合的合并与查询问题。

并查集主要支持两个操作:
1. 合并(Union):将两个不相交的集合合并成一个集合。
2. 查询(Find):查询元素所在的集合。

并查集可以用于解决一些集合相关的问题,例如判断两个元素是否属于同一个集合,求集合中的元素个数等。

并查集的实现通常使用数组和树结构。数组表示每个元素的父节点,树结构表示集合的层次结构。在进行查找操作时,通过递归或迭代找到根节点;在进行合并操作时,将一个集合的根节点连接到另一个集合的根节点上。

并查集的时间复杂度主要取决于合并和查询操作的路径长度,通常可以达到近似常数时间复杂度。

例如,假设有5个元素分别为1、2、3、4、5,初始时每个元素都是一个单独的集合:
[1, 2, 3, 4, 5]

执行合并操作:将元素1和元素2合并
[2, 2, 3, 4, 5]

执行合并操作:将元素2和元素3合并
[2, 2, 2, 4, 5]

执行查询操作:查询元素1所在的集合
2

执行查询操作:查询元素4所在的集合
4

并查集是一种简单且高效的数据结构,可以在解决某些集合问题时提供方便和效率。

模板:

int find(int x)//查找
{if (f[x] == x) return x;return f[x] = find(f[x]);
}
void merge(int x, int y) //合并
{x = find(x), y = find(y);if (x != y)f[x] = f[y];
}

题目一(合根植物):

代码:

#include<iostream>
using namespace std;
int f[1000010];
int find(int k)//查询父亲
{if (f[k] == k)return k;else{f[k] = find(f[k]);return f[k];}
}
void merge(int a, int b)//合并
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n * m; i++)//初始化{f[i] = i;}int k;cin >> k;while (k--){int a, b;cin >> a >> b;merge(a, b);//合并}long long ans=0;for (int i = 1; i <= n * m; i++){if (f[i] == i)//父亲为自己则为一个集合的代表ans++;}cout << ans;
}

题目二(蓝桥幼儿园): 

代码:

#include<iostream>
using namespace std;
int n,m;
int f[200100];
int find(int x)//查找
{if(f[x]==x)return x;return f[x]=find(f[x]);
}
void merge(int x,int y)//合并
{x=find(x),y=find(y);if(x!=y)f[x]=f[y];
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)//初始为自己f[i]=i;while(m--){int x,y,z;cin>>z>>x>>y;if(z==1)//操作一合并{merge(x,y);}else//操作二{if(find(x)==find(y))cout<<"YES"<<endl;elsecout<<"NO"<<endl;}}
}

题目三(小猪存钱罐):

代码:

#include <iostream>//实际上就是几个连通分支
using namespace std;
int n,ans=0;
int f[1001000];
int find(int x)//查找
{if (f[x] == x) return x;return f[x] = find(f[x]);
}
void merge(int x, int y) //合并
{x = find(x),y = find(y);if (x != y) f[x] = f[y];
}
int main()
{cin>>n;for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=n;i++){int x;cin>>x;merge(x,i);}for(int i=1;i<=n;i++){if(f[i]==i)//有一样的则为一个集合里的ans++;}cout<<ans;
}

题目四(星球大战):

代码:

#include<iostream>
#include<vector>
using namespace std;
int n, f[500100], ans[500100], m, k,cnt=0;
vector<int> e[500100];
int destroys[500100];
int broken[500100];
int find(int x)//查找
{if (f[x] == x) return x;return f[x] = find(f[x]);
}
void merge(int x, int y) //合并
{x = find(x),y = find(y);if (x != y) f[x] = f[y];
}
int main()
{cin >> n >> m;while (m--){int x, y;cin >> x >> y;e[x].push_back(y), e[y].push_back(x);}cin >> k;for (int i = 0; i < k; i++){cin >> destroys[i];broken[destroys[i]] = 1;//标记为摧毁}for (int i = 0; i < n; i++)//初始化父亲点为自身f[i] = i;for (int i = 0; i < n; i++){if (broken[i])//被摧毁则跳过continue;for (int j = 0; j < e[i].size(); j++)//遍历i点相连的边{int tmp = e[i][j];//相邻的点if (broken[tmp])//被摧毁跳过continue;merge(i, tmp);//合并两点为同一连通块}}for (int i = 0; i < n; i++)//遍历所有城市,先找到所有摧毁完后的连通块数if (!broken[i] && find(i) == i)//该城市没被摧毁且不是自身为父亲节点cnt++;for (int i = k - 1; i >= 0; i--)//从后往前修复道路{ans[i] = cnt;//记录该城市还没被修复时的连通块数量broken[destroys[i]] = 0;//修复该点cnt++;//修复该点,可以成为一个独立的连通分支for (int j = 0; j < e[destroys[i]].size();j++)//遍历该摧毁点的相连边{int v = e[destroys[i]][j];//相邻的点if (!broken[v] && find(v) != find(destroys[i]))//该城市没被摧毁且二者之前不属于同一连通块{merge(v, destroys[i]), cnt--;//因为原本相连,其实二者为同一连通块,合并二者且连通数减一}}}cout << cnt << endl;//完整时的连通块数量for (int i=0;i<k;i++)cout << ans[i] << endl;}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-Linux安装

JDK安装&#xff08;linux版&#xff09; CentOS7环境&#xff1a; jdk下载地址huaweicloud.com 创建目录&#xff1a; mkdir /opt/jdk通过 ftp 客户端 上传 jdk压缩包&#xff08;linux版本&#xff09;到 1中目录进入目录&#xff1a;cd /opt/jdk解压&#xff1a;tar -zxv…

前端爬虫+可视化Demo

爬虫简介 可以把互联网比做成一张 “大网”&#xff0c;爬虫就是在这张大网上不断爬取信息的程序。 爬虫是请求网站并提取数据的自动化程序。 省流&#xff1a;Demo实现前置知识&#xff1a; JS 基础Node 基础 &#xff08;1&#xff09;爬虫基本工作流程&#xff1a; 向…

Python通过SFTP实现网络设备配置备份

一、背景 为了防止网络设备意外损坏&#xff0c;导致配置文件无法恢复&#xff0c;可以通过将网络设备的配置文件备份到本地电脑上。 一般情况下&#xff0c;设备支持通过FTP、TFTP、FTPS、SFTP和SCP备份配置文件。其中使用FTP和TFTP备份配置文件比较简单&#xff0c;但是存在…

从零开始学习Diffusion Models: Sharon Zhou

How Diffusion Models Work 本文是 https://www.deeplearning.ai/short-courses/how-diffusion-models-work/ 这门课程的学习笔记。 文章目录 How Diffusion Models WorkWhat you’ll learn in this course [1] Intuition[2] SamplingSetting Things UpSamplingDemonstrate i…

开源模型应用落地-工具使用篇-Ollama(六)

一、前言 在AI大模型百花齐放的时代&#xff0c;很多人都对新兴技术充满了热情&#xff0c;都想尝试一下。但是&#xff0c;实际上要入门AI技术的门槛非常高。除了需要高端设备&#xff0c;还需要面临复杂的部署和安装过程&#xff0c;这让很多人望而却步。不过&#xff0c;随着…

RabbitMQ的web控制端介绍

2.1 web管理界面介绍 connections&#xff1a;无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#xff0c;在这里可以查看连接情况channels&#xff1a;通道&#xff0c;建立连接后&#xff0c;会形成通道&#xff0c;消息的投递、获取…

html--心花怒放

代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Canvas 绘制一个❤</title><link rel"shortcut icon" href"../../assets/images/icon/favicon.ico" type"ima…

嵌入式学习36-TCP要点及http协议

TCP发送文件的粘包问题 1. 例&#xff1a; 发端 1.flv-------->收端 1.flv csfga 2.解决 1. sleep&#xff08;1&#xff09; 延时发送 2.自…

SHARE 100M PRO:航测领域的多面手

在无人机航测领域&#xff0c;SHARE 100M PRO单镜头航测相机以其1.02亿像素的中画幅传感器和创新技术&#xff0c;正在重塑倾斜摄影的精度和效率。这款相机不仅在城市规划和土地管理中发挥着重要作用&#xff0c;还在环境监测、基础设施建设、农业管理等多个航测领域展现出其卓…

斐讯N1 刷coreelec 笔记

1.下载恩山的镜像 下载好后不需要刷优盘 这个很方便&#xff0c;可以勾选擦除flash &#xff08;如果第一次装&#xff09; 升级可以不用勾选 详细使用参考恩山大佬的描述 2.下载插件 想装openwrt 发现镜像里面 coreelec-addons 挂了&#xff0c;研究了好长时间可以 去githu…

MRI基础--k空间

k空间定义 k空间是表示 MR 图像中空间频率的数字数组。 k空间物理意义 k 空间的单元通常显示在主轴 kx 和 ky 的矩形网格上。 k 空间的 kx 和 ky 轴对应于图像的水平 (x) 和垂直 (y) 轴。然而,k 轴表示 x 和 y 方向上的空间频率而不是位置。 k 空间中的各个点 (kx,ky) 与图像…

R语言 | 复数 相关函数

问题 大家好&#xff0c;我有一个问题&#xff0c;我看到一个函数如下&#xff1a; L2_distance <- function(A, B){rowA <- apply(A*A, 1, sum)matrixA <- matrix(rep(rowA, eachlength(rowA)), nrowlength(rowA), byrowT)rowB <- apply(B*B, 1, sum)matrixB &l…