并查集模版以及两道例题

news2024/11/25 9:54:34

💯 博客内容:并查集

😀 作  者:陈大大陈

🚀 个人简介:一个正在努力学技术的准C++后端工程师,专注基础和实战分享 ,欢迎私信!

💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

 

目录

初版

路径压缩版 

两个例题 

几张桌子

是不是亲戚 


并查集是一种挺实用的数据结构,可以处理一些不相交集合的合并问题

基本操作有初始化,合并,查找,统计。

咱们先来个初版,再优化一下。

初版

#include<bits/stdc++.h>
using namespace std;
const int N = 10000;
int fa[N];
void init(int N)//初始化
{
	for (int i = 1; i <= N; i++)
	{
		fa[i] = i;
	}
}
int find(int i)//查找
{
	return i == fa[i] ? i : find(fa[i]);
}
void Union(int i, int j)//合并
{
	int x = find(i);
	int y = find(j);
	fa[x] = y;
}

这种并查集查找的效率太低,最坏情况的时间复杂度能达到O(N)。

我们就针对它优化。

路径压缩版 

#include<bits/stdc++.h>
using namespace std;
const int N = 10000;
int fa[N];
void init(int N)
{
	for (int i = 1; i <= N; i++)
	{
		fa[i] = i;
	}
}
int find(int i)
{
	if (i == fa[i])
	{
		return i;
	}
	else
	{
		fa[i] = find(fa[i]);
		return fa[i];
	}
}
void Union(int i, int j)
{
	int x = find(i);
	int y = find(j);
	fa[x] = y;
}

上面的时间复杂度最好能有O(1)。

实现方式是记忆化搜索,用数组存储好所需结果,需要时就不用再次递归了。

来看两个例题巩固一下。

两个例题 

几张桌子

How Many Tables(并查集)

Problem - 1213 (hdu.edu.cn)

题目:

Today is Ignatius’ birthday. He invites a lot of friends. Now it’s dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers.

One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.

For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.

Input

The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.

Output

For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.

Sample Input


5 3 
1 2 
2 3 
4 5

5 1 
2 5

Sample Output

4

思路:每个人是一个数组,两个数组内存的数如果相同,代表认识并成为一桌;(每个数组内刚开始都是自身编号)

给你们一组特殊测试数据:

输入:

1

5 4

1 2

1 3

4 3

3 4

输出:

2
 

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
const int N = 1050;
int fa[N];
void init()
{
	for (int i = 1; i <= N; i++)
	{
		fa[i] = i;
	}
}
int find(int i)
{
	if (i == fa[i])
	{
		return i;
	}
	else
	{
		fa[i] = find(fa[i]);
		return fa[i];
	}
}
void Union(int i, int j)
{
	int x = find(i);
	int y = find(j);
	fa[x] = y;
}
int main()
{
	int t, x, y, n, m;
	cin >> t;//t个测试
	while (t--)
	{
		cin >> n >> m;
		init();
		for (int i = 1; i <= m; i++)
		{
			cin >> x >> y;
			Union(x, y);//合并x和y
		}
		int ans = 0;
		for (int i = 1; i <= n; i++)//统计有多少个集
		{
			if (fa[i] == i)
				ans++;
		}
		cout << ans << endl;
	}

	return 0;
	
}
是不是亲戚 

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
const int N = 1050;
int fa[N];
void init()
{
	for (int i = 1; i <= N; i++)
	{
		fa[i] = i;
	}
}
int find(int i)
{
	if (i == fa[i])
	{
		return i;
	}
	else
	{
		fa[i] = find(fa[i]);
		return fa[i];
	}
}
void Union(int i, int j)
{
	int x = find(i);
	int y = find(j);
	fa[x] = y;
}
int main()
{
	int n, m, n2;;
	cin >> n >> m;
	init();
	for (int i = 0; i < m; i++)
	{
		int x, y;
		cin >> x >> y;
		Union(x, y);
	}
	cin >> n2;
	for (int i = 0; i < n2; i++)
	{
		int x, y;
		cin >> x >> y;
		if (find(x) == find(y))
			cout << "Yes" << endl;
		else
			cout << "No" << endl;

	}
	return 0;
	
}

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

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

相关文章

贴片电容规格怎么看?

贴片电容规格怎么看&#xff1f; 原理图中的电容参数给的数值&#xff0c;目的是便于分析电路。而采购的电容&#xff0c;所给的参数是一串字母和数字组成的字符串&#xff0c;来料检查人员必须根据料单&#xff0c;判断来料是否合格。有时&#xff0c;在一些面试场合&#xf…

浅谈测试需求分析

一、什么是需求分析 小编理解的需求分析就是要弄清楚用户需要的是什么功能&#xff0c;用户会怎样使用系统。这样测试时才能更清楚的知道系统该怎么样运行&#xff0c;才能更好的设计测试用例&#xff0c;才能更好的测试。 测试需求分析是测试工作的第一步&#xff0c;经过需…

NOIP2023模拟12联测33 D. 滈葕

NOIP2023模拟12联测33 D. 滈葕 文章目录 NOIP2023模拟12联测33 D. 滈葕题目大意思路code 题目大意 思路 放一段题解的材料 ABO 血型系统是血型系统的一种&#xff0c;把血液分为 A,B,AB,O 四种血型。血液由红细胞和血清等组成&#xff0c;红细胞表面 有凝集原&#xff0c;血清…

ChatGPT新功能曝光!OpenAI首届开发者大会抢先看

OpenAI将于太平洋时间11月6日早上10点举办首届全球开发者大会&#xff08;大约北京时间11月7日凌晨2点&#xff09;&#xff0c;与来自世界各地的开发者、企业、技术合作伙伴&#xff0c;分享OpenAI最新产品和技术趋势。 由于OpenAI的金字招牌太响&#xff0c;已经有不少人迫不…

2023(第四届)江西开放数据创新应用大赛等你来挑战!

邀请函 这是一个友好的邀请。无论你是数据领域的专家、学生还是爱好者&#xff0c;我们都欢迎你加入这个平台。这不仅仅是一场比赛&#xff0c;更是一个交流、学习和展示自己的机会。 丰厚奖金&#xff1a;我们为参赛者准备了总计15W的奖金池&#xff0c;期待你的才华在这里得…

linux环境下LSI RAID卡在线扩盘和系统分区扩容简易操作

重要提醒 --- 数据安全--- 备份 备份 备份&#xff01;&#xff01;&#xff01; 一、RAID工具Storcli Storcli管理工具下载 https://download.lenovo.com/servers/mig/2022/06/01/55714/lnvgy\_utl\_raid\_mr3.storcli-007.2008.0000.0000-0\_linux\_x86-64.tgz Storcli工…

Python类继承(单继承)

自定义“鸟”类&#xff0c;“鸣禽”、“猛禽”继承自“鸟”类&#xff0c;“画眉”、“百灵”继承自“鸣禽”&#xff0c;“鹰”、“雕”继承自“猛禽”。 (笔记模板由python脚本于2023年11月06日 19:08:56创建&#xff0c;本篇笔记适合初通Python类的coder翻阅) 【学习的细节…

基于ssm+jsp背单词系统的设计与实现

ssm背单词系统&#xff0c;java记单词系统&#xff0c;背单词系统 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;8.x版本都可&#xff09; 硬件环境&#xff1a;Windows 角色&#xff…

力扣 138. 随机链表的复制

题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的…

NOIP2023模拟12联测33 总结

NOIP2023模拟12联测33 总结 文章目录 NOIP2023模拟12联测33 总结比赛过程正解A. 构造题目大意思路 思路B.游戏题目大意思路 C. 数数题目大意 D. 滈葕题目大意思路 总结 比赛过程 先看了一眼 T 1 T1 T1 &#xff0c;发现又是恶心构造题&#xff0c;果断跳过。 T 2 T2 T2 期望题…

Luckysheet 实现excel多人在线协同编辑

前言 前些天看到Luckysheet支持协同编辑Excel&#xff0c;正符合我们协同项目的一部分&#xff0c;故而想进一步完善协同文章&#xff0c;但是遇到了一下困难&#xff0c;特此做声明哈&#xff0c;若侵权&#xff0c;请联系我删除文章&#xff01; 若侵犯版权、个人隐私&#x…

Flink的API分层、架构与组件原理、并行度、任务执行计划

Flink的API分层 Apache Flink的API分为四个层次&#xff0c;每个层次都提供不同的抽象和功能&#xff0c;以满足不同场景下的数据处理需求。下面是这四个层次的具体介绍&#xff1a; CEP API&#xff1a;Flink API 最底层的抽象为有状态实时流处理。其抽象实现是Process Functi…

MySQL -- 索引

MySQL – 索引 文章目录 MySQL -- 索引一、索引简介1.简介2.索引效率的案例 二、认识磁盘1.磁盘2.结论3.磁盘随机访问(Random Access)与连续访问(Sequential Access) 三、MySQL 与磁盘交互基本单位1.基本单位2.MySQL中的数据管理 五、索引的理解1.索引案例2.单页mysql page3.管…

“七人拼团模式:创新玩法助力平台快速裂变引流“

七人拼团模式是一种结合了社交电商和拼购玩法的快速裂变引流模式。这种模式通过抽取平台营业所得作为奖励补贴用户&#xff0c;以更人性化的奖励机制吸引用户&#xff0c;服务用户&#xff0c;以此加快用户向粉丝的转变&#xff0c;为平台拉取有效流量。本文将介绍七人拼团模式…

二十、泛型(2)

本章概要 泛型接口泛型方法 变长参数和泛型方法一个泛型的 Supplier简化元组的使用一个 Set 工具 泛型接口 泛型也可以应用于接口。例如 生成器&#xff0c;这是一种专门负责创建对象的类。实际上&#xff0c;这是 工厂方法 设计模式的一种应用。不过&#xff0c;当使用生成…

基础课23——设计客服机器人

根据调查数据显示&#xff0c;使用纯机器人完全替代客服的情况并不常见&#xff0c;人机结合模式的使用更为普遍。在这两种模式中&#xff0c;不满意用户的占比都非常低&#xff0c;不到1%。然而&#xff0c;在满意用户方面&#xff0c;人机结合模式的用户满意度明显高于其他模…

freertos简单串口

先来完善一下FreeRTOSConfig.h这个配置文件 /*FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.All rights reservedVISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.This file is part of the FreeRTOS distribution.FreeRTOS is …

无代码平台哪家好,盘点最新国内十大无代码零代码平台排名

无代码&#xff08;No Code&#xff09;是一种通过使用可视化界面和预构建的模块来创建应用程序、网站或其他数字化解决方案的方法&#xff0c;不需要编写大量的手动代码。 无代码平台通常包括一些基本的构建块&#xff0c;如表单、按钮、文本框等&#xff0c;用户可以通过拖拽…

用小程序打造品牌网站的效果如何

网站是企业线上门户&#xff0c;很多企业或商家在成立之初就会选择搭建企业官网展示品牌、承载信息及服务相关预约咨询等&#xff0c;当然除了搭建网页外&#xff0c;还可以通过小程序实现官网效果。 除了浏览器流量外&#xff0c;如微信、百度、头条抖音、支付宝、快手等平台…

ACWing.第 128 场周赛 (B、C题解)

B、5286. 翻倍&#xff08;思维推导&#xff09; 一、题目要求 给定两个正整数&#xff0c;初始时两数均为 1。 你可以进行任意次&#xff08;也可以不进行&#xff09;翻倍操作&#xff0c;每次操作任选一个非负整数 k&#xff0c;令两数中的一个数乘以 k&#xff0c;另一个…