当前位置: 首页 > article >正文

备战蓝桥杯-并查集

三天不练手生,已经很久没有练习算法题了,今天用我最喜欢的并查集来启动我的算法练习

并查集的三个步骤

1 初始化

2 路径压缩+查询

int find(int x)
{
	if (x != a[x]) a[x] = find(a[x]);
	return a[x];
}

3 合并

void merge(int x, int y)
{
	x = find(x);
	y = find(y);
	if (x != y) a[x] = y;
}

练习题

P3367 【模板】并查集

P3367 【模板】并查集 - 洛谷 | 计算机科学教育新生态

思路:无脑并查集

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define int long long
const int N = 1e6 + 10;
int a[N];
int find(int x)
{
	if (x != a[x]) a[x] = find(a[x]);
	return a[x];
}
void merge(int x, int y)
{
	x = find(x);
	y = find(y);
	if (x != y) a[x] = y;
}
signed main()
{
	int n, m;
	std::cin >> n >> m;
	for (int i = 1;i <= n;i++)
	{
		a[i] = i;
	}
	while (m--)
	{
		int z, x, y;
		std::cin >> z >> x >> y;
		if (z == 1)
		{
			merge(x, y);
		}
		if (z == 2)
		{
			if (find(x) == find(y))
			{
				std::cout << "Y\n";
			}
			else
			{
				std::cout << "N\n";
			}
		}
	}
	return 0;
}

P1551 亲戚

https://www.luogu.com.cn/problem/P1551

无脑模板

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <utility>
#define ing long long
const int N = 5e3 + 10;
int s[N];
int find(int x)
{
	if (x != s[x])s[x] = find(s[x]);
	return s[x];
}
void merge(int x, int y)
{
	x = find(x);
	y = find(y);
	if (x != y)
	{
		s[x] = y;
	}
}
signed main()
{
	int n, m, p;
	std::cin >> n >> m >> p;
	for (int i = 1;i <= n;i++)
	{
		s[i] = i;
	}
	while (m--)
	{
		int x, y;
		std::cin >> x >> y;
		merge(x, y);
	}
	while (p--)
	{
		int x, y;
		std::cin >> x >> y;
		if (find(x) == find(y))
		{
			std::cout << "Yes\n";
		}
		else
			std::cout << "No\n";
	}
	return 0;
}

集合写真

集合写真 - 洛谷 | 计算机科学教育新生态

这道题好像和并查集没什么关系,但是真没想到没写endl居然过不了,后来看了大佬们的题解发现要输出一个endl,暴力即可

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <utility>
#define ing long long
const int N = 50 + 10;
int a[N];
signed main()
{
	int n;
	std::cin >> n;
	for (int i = 1;i <= n;i++)
	{
		std::cin >> a[i];
	}
	int x;
	std::cin >> x;
	int pos = -999;
	for (int i = 1;i <= n;i++)
	{
		if (x < a[i])
		{
			pos = i ;
			break;
		}
	}
	if (pos != -999)
	{
		std::cout << pos<<"\n";
	}
	else
		std::cout << n + 1<<"\n";
	return 0;
}


http://www.kler.cn/a/533564.html

相关文章:

  • 21.2.1 基本操作
  • MYSQL面试题总结(题目来源JavaGuide)
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】3.1 NumPy图像大小调整实战
  • Codeforces Round 997 (Div. 2) A~D题解
  • 扩展域并查集 带权并查集
  • 【论文复现】粘菌算法在最优经济排放调度中的发展与应用
  • 【力扣】54.螺旋矩阵
  • PyQt6/PySide6 的 QMainWindow 类
  • 数据传输-工作习惯问题
  • CNN的各种知识点(五):平均精度均值(mean Average Precision, mAP)
  • GaussDB安全配置建议
  • 本地安装部署deepseek
  • 使用 Swift 完成FFmpeg音频录制、播放和视频格式转换应用
  • RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)
  • 【OpenCV实战】基于 OpenCV 的多尺度与模板匹配目标跟踪设计与实现
  • 简易C语言矩阵运算库
  • 【C语言】指针详细解读3
  • 激光工控机在自动化领域中有哪些作用?
  • vim modeline
  • CTP查询资金费率和手续费没响应
  • 零基础Vue入门6——Vue router
  • 【CPP】CPP经典面试题
  • Ollama:一站式 AI 模型管理与交互平台,什么是 Ollama,Ollama 的核心功能,Ollama 的使用场景
  • AWS上设计可图形化创建处理逻辑的智能电话语音客服程序的流程和关键代码
  • Junit5使用教程(3)
  • 3.Pandas库