并查集(C++)

news2024/9/21 16:42:58

根据下面这道题讲下并查集

(其实本来是写题解的…写着写着就变成算法说明了)

[蓝桥杯 2017 国 C] 合根植物(C++,并查集)

题目描述

w 星球的一个种植园,被分成 m × n m \times n m×n 个小格子(东西方向 m m m 行,南北方向 n n n 列)。每个格子里种了一株合根植物。

这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。

如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?

输入格式

第一行,两个整数 m m m n n n,用空格分开,表示格子的行数、列数( 1 < m , n < 1000 1<m,n<1000 1<m,n<1000)。

接下来一行,一个整数 k k k,表示下面还有 k k k 行数据 ( 0 < k < 1 0 5 ) (0<k<10^5) (0<k<105)

接下来 k k k 行,第行两个整数 a a a b b b,表示编号为 a a a 的小格子和编号为 b b b 的小格子合根了。

格子的编号一行一行,从上到下,从左到右编号。

比如: 5 × 4 5 \times 4 5×4 的小格子,编号:

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16
17 18 19 20

输出格式

一行一个整数,表示答案

样例 #1

样例输入 #1

5 4
16
2 3
1 5
5 9
4 8
7 8
9 10
10 11
11 12
10 14
12 16
14 18
17 18
15 19
19 20
9 13
13 17

样例输出 #1

5

提示

样例解释

请添加图片描述

时限 1 秒, 256M。蓝桥杯 2017 年第八届国赛

解题思路:

emmm我也不知道该怎么引入,直接进行说明吧

并查集实现的就是合并两个元素(也可以是集合)成为一个集合

首先我们要知道如何辨别一个集合

我们知道一棵树所有子节点的根节点是相同的,换言之,根节点可以代表一棵树,抽象一点,就可以代表一个集合

那么如何寻访根节点呢?

int find(x) {//寻访节点x的根节点
	if (father[x] == x)//x是根节点
		return x;
	else//x不是根节点
		return find(father[x]);//寻访x的父节点
}

这个递归,应该…很好理解吧

但是如果一棵树的深度过深的话会导致寻访很慢,于是我们进行路径压缩

int find(x) {//寻访节点x的根节点
	if (father[x] == x)//x是根节点
		return x;
	else {//x不是根节点
		father[x] = find(father[x]);//路径压缩
		return father[x];//寻访x的父节点
	}
}

就是把所有子节点都连到根节点上

可以将以上代码优化

int find(x) {
	return x == father[x] ? x : (father[x] = find(father[x]));
}

学会了辨别一个集合,接下来学习如何合并两个元素(或集合)

void merge(int x, int y) {
	father[x] = father[y];
}

当然前提是判断两个元素不在一个集合中

bool is_same(int x, int y) {
	if (find(x) == find(y)) return true;//一个集合
	else return false;//两个集合
}

至此本题讲解完…好像没完,用递归寻访根节点会被卡掉

接下来介绍优化寻访的另一种方法,按秩合并

寻访慢的原因就是树的深度过深,我们希望深度尽可能的浅,这就是按秩合并的基本思想

void merge(int x, int y) {
	if (depths[x] <= depths[y]) {//如果x是更简单的树
		father[y] = father[x];//连接简单树到复杂树上
	}
	else father[x] = father[y];
	
	if (depths[x] == depths[y])
		depths[y]++;//如果深度相同,y的深度++,可以自行思考一下为什么(很简单的)
}

使用按秩合并记得要把所有元素的深度初始化为1

最后简单说明一下题意就可以明白了

其实二维的平面是假想的,直接维护一个m*n大小的数组就可以了

寻访根节点可以修改为while循环,大多数返回后没有指令的递归都可以优化为while不定循环

最后,AC代码如下

//并查集
#include <iostream>
using namespace std;
const int max_m = 1000;
const int max_n = 1000;

int ans;
int map[max_m * max_n] = { 0 };
int depths[max_m * max_n] = { 1 };

//寻访根节点
int find(int x) {
	while (map[x] != x)	x = map[x];
	return x;
}

//按秩合并
void merge(int x, int y) {
	if (depths[x] >= depths[y]) map[y] = map[x];
	else map[x] = map[y];

	if (depths[x] == depths[y]) depths[y]++;
}

int main() {
	int m, n, k, u, v;
	cin >> m >> n >> k;
	int mul = m * n;
	for (int i = 1; i <= mul; i++) {//初始化
		map[i] = i;
		depths[i] = 1;
	}
	ans = m * n;

	for (int i = 0; i < k; i++) {//合并集合
		cin >> u >> v;
		int temp_1 = find(u);
		int temp_2 = find(v);
		if (temp_1 != temp_2) ans--;//集合数目-1
		merge(temp_1, temp_2);
	}
	cout << ans;
	return 0;
}

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

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

相关文章

【深度腐蚀】深入聊聊KMP算法

思路分析&#xff1a;主串str遍历主串j子串sub遍历子串iKMP算法是一种字符串匹配算法&#xff0c;他通过Next 数组能使i不回退&#xff0c;这样大大减少了无效的比对&#xff0c;提高了字符串匹配的速度。Next数组&#xff1a;要想让i不回退&#xff0c;就需要让j回退到合适的位…

HTTPS】HTTPS过程详解,tcpdump抓包 全过程分析

RFC中的HTTPS交互过程如下&#xff1a; 抓包分析 Client Hello 客户端支持的TLS最高版本号 客户端生成的随机数 客户端支持的加密套件 主机名server_name cipher suite怎么理解 名字为 ECDH-ECDSA-AES128-SHA256 的CipherSuite 使用 ECDH做密钥交换&#xff0c; 使用ECDS…

21. 反爬工程师都会用的手段,IP限制反爬 - 爬虫训练场

本篇博客我们实现的案例是 IP 限制反爬&#xff0c;翻译过来就是每个 IP 在规定时间内限制访问次数。 例如&#xff0c;可以限制单 IP 每秒访问 5 次&#xff0c;超过之后就会返回 403 错误。 Flask 实现 IP 限制使用 Flask 插件自定义中间件限制 IP自定义请求钩子使用 Flask 插…

CSS3 滤镜效果

文章目录CSS3 滤镜效果概述说明使用案例鬼屋效果代码下载CSS3 滤镜效果 概述 在CSS3中&#xff0c;新增了滤镜效果&#xff0c;可以轻松实现黑白效果、复古效果、亮度效果等。 说明 语法 filter: 取值;filter属性取值 属性值说明brightness(百分比)亮度brightness()方法的…

一款数据可视化分析报表工具

在这个数据信息化时代&#xff0c;每分每秒都产生海量数据&#xff0c;在海量数据中&#xff0c;挖掘出有用的数据&#xff0c;并且能以直观的方式展示这些数据&#xff0c;变得尤为重要&#xff0c;大家或许还在为做报表感到为难&#xff0c;想在众多数据中处理&#xff0c;查…

leetcode-hot链表专题——206. 反转链表

206. 反转链表 递归法 ListNode* reverse(ListNode *pre,ListNode *cur){if(cur NULL) return pre;ListNode *next cur->next;cur->next pre;return reverse(cur,next);}ListNode* reverseList(ListNode* head) {return reverse(NULL,head);}迭代法 ListNode* rever…

Python爬虫编写乱码问题、验证码登录问题和IP代理问题解决

今天继续给大家介绍Python爬虫相关知识&#xff0c;本文主要内容是Python爬虫编写乱码问题、验证码登录问题和IP代理问题解决。 一、乱码问题解决 我们在使用Python爬虫爬取网页信息时&#xff0c;有时会遇上乱码问题&#xff08;特别是爬取中文网页信息时&#xff09;&#…

C语言进阶——指针(二)

一. 函数指针 说到指针&#xff0c;我们可以想到的是取地址操作符 int ADD(int a,int b) {return ab; } int main() {printf("%p\n", &ADD);return 0; } 如此&#xff0c;我们便可以得到一个地址 而我们便可以将这个地址存入到一个函数指针中 int(*p)(int,…

各种卷积的说明

一、普通卷积 1、多通道输入&#xff0c;单通道输出 输入为三通道的6*6*3&#xff0c;过滤器也是三通道的分别对应RGB三个通道。其中&#xff1a; 过滤器的通道数需要和被卷积目标的通道数保持一致。输出通道数卷积核个数计算过程包含了先卷积再融合的过程。3个通道各种卷积得…

图像处理:二值掩膜影像去噪与边缘强化

前言这篇博客主要解决的一个问题是掩膜图像的噪声去除和边缘强化&#xff0c;如下图1所示。可以看到掩膜图像上有很多的斑点噪声&#xff0c;而且掩膜的轮廓也不够清晰。所以我们的目标就是一方面尽可能把这些斑点噪声去除&#xff0c;另一方面尽量突出掩膜边界。另外处理后的掩…

c#入门-多播委托,匿名函数

多播委托 委托作为变量&#xff0c;也可以和-。委托可以和方法组相加&#xff0c;但方法组和方法组不能相加。 储存多个函数时&#xff0c;调用委托会按照加的顺序依次执行。但返回值只使用最后绑定的函数。 使用 – 时&#xff0c;如果储存了这个值&#xff0c;那么会移除第一…

深圳电子行业的mes系统的需求分析方法~先达智控

深圳电子行业mes系统的需求分析方法导读&#xff1a;如今&#xff0c;制造业的行业竞争越来越激烈&#xff0c;减少产品成本、提高产品质量&#xff0c;缩短开发周期&#xff0c;已成为当前企业生产与发展中的一个重点方向。而对电子行业而言&#xff0c;厂家着重考虑并解决了产…

我们想要赚钱,就要理解赚钱的本质、要素、公式和障碍

想要赚钱&#xff0c;就要先理解赚钱&#xff0c;只有理解了赚钱&#xff0c;才能够赚到钱。赚钱的本质是商业&#xff0c;而商业的本质是交易&#xff0c;那交易的本质又是什么呢&#xff1f;就是价值交换。价值交换&#xff0c;就是我们怎么能与别人达成合作&#xff0c;并且…

朱江明赋予了零跑新的活力

作为今年风云的智能自主化新能源汽车品牌&#xff0c;零跑汽&#xff0c;一度是人们谈论的热点话题。零跑汽车在今年也取得了非常不错的销量&#xff0c;这么一个响当当的品牌在之前其实发展几度遭遇挫折&#xff0c;而正是创始人朱江明几次将零跑汽车起死回生&#xff0c;赋予…

使用基于python的neurora进行表征相似性分析(RSA)

发现了一款用于表征分析的Python API&#xff0c;还是挺方便的&#xff0c;这里简单介绍一下进行表征相似性分析的使用方法。官方文档见https://neurora.github.io/documentation/index.html下载pip install neurora表征相似性分析的知识可见&#xff1a;https://zhuanlan.zhih…

QSqlDatabase::drivers()输出为空的解决办法

解决问题&#xff1a;今天项目中需要用到QT连接MYSQL数据库进行数据库访问&#xff0c;使用数据库驱动加载代码&#xff1a; qDebug()<<"数据库驱动&#xff1a;"<<QSqlDatabase::drivers();打印出来的结果居然为空“()”。 尝试解决方案&#xff1a; …

逻辑漏洞渗透与攻防(三)之登录前端验证漏洞

目录 前言 登录前端验证漏洞 忘记密码 给邮箱/手机发验证码 前端验证绕过 设置新密码时改他人密码 ​编辑 某网站密码找回功能 链接的形式-链接token参数可逆 服务端验证逻辑缺陷 登录状态下修改密码等验证条件 参数带用户名等多阶段验证 重置密码 重置后的默认密…

软件产品科技成果鉴定需要提供哪些材料?软件测试费用怎么算?

一、软件产品科技成果鉴定是什么? 软件产品科技成果鉴定是有效评价科技成果质量和水平的方法之一&#xff0c;也是鼓励科技成果通过市场竞争等方式得到有效的评价和认可&#xff0c;可以推动科技成果的进步和转化。软件产品科技成果鉴定测试报告是申报国家、省、市科技成果奖…

SQLite Database Introduction

Use SQLite installed on Linux (CentOS7) to introduce.(You can also use python to install SQLite3 for learning.)•SQLite Preface•Introduction to SQLite Features•SQLite Data Type•SQLite Constraint•SQLite Syntax•SQLite Join•SQLite Database & Table•…

第01讲:ElasticSearch安装

一、什么是ElasticSearch 二、ElasticSearch的安装 Elasticsearch 分为 Linux 和 Windows 版本&#xff0c;基于我们主要学习的是 Elasticsearch 的 Java 客户端的使用&#xff0c;所以课程中使用的是安装较为简便的 Windows 版本。 2.1、Windows系统下安装ElasticSearch W…