一篇文章带你通关并查集(持续更新中)

news2025/2/25 4:46:23

这篇文章的所有题目均来自于自行整理,代码均来自于自行梳理调试(思路可能比较暴力)。初衷在于整理练习思路,且起到督促自己学习的作用

本文分成将三个模块

1.普及组 (洛谷黄题)

2.提高组 (洛谷绿题)

3.省选组 (洛谷蓝题及以上)

一、普及

1.P3367 【模板】并查集

普通并查集(纯板子,不加解释)

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P3367

// Problem: 
//     P3367 【模板】并查集
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3367
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
using namespace std;
const int N=1e4+10;
int e[N];

int find(int x){
	if(x!=e[x]) e[x]=find(e[x]);
	return e[x];//返回根节点
}

void merge(int a,int b){
	int x=find(a);int y=find(b);
	//e[x]=y;连接到另外一个上,我看了看板子更加复杂,但是符合原理都能过
    这里前面加一个if(x!=y)会更好,若不然可能增加路径压缩的次数
}

int main(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;++i) e[i]=i;
	while(m--){
		int a,b,c;cin>>a>>b>>c;
		if(a==1){
			merge(b,c);
		}
		else{
			int k1=find(b);int k2=find(c);
			if(k1==k2) cout<<"Y"<<endl;
			else cout<<"N"<<endl;
		}
	}
	return 0;
}

2.P1551 亲戚

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1551

一道算是应用场景的题目,可以拿来熟熟手

// Problem: 
//     P1551 亲戚
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1551
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
using namespace std;
const int N=5005;
int fa[N];

int find(int x){
	if(x!=fa[x]) fa[x]=find(fa[x]);
	return fa[x];//返回根节点
}

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


int main(){
	int n,m,p;cin>>n>>m>>p;
	for(int i=1;i<=n;++i) fa[i]=i;
	while(m--){
		int a,b;cin>>a>>b;
		merge(a,b);
	}
	while(p--){
		int a,b;cin>>a>>b;
		int x=find(a),y=find(b);
		if(x==y) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	
	
	return 0;
}

3.P1111 修复公路

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1111

五花八门的答案,结合了一点排序知识

本人用了结构体排序后全遍历,O(nm)的时间复杂度(1e8)擦边过了

// Problem: 
//     P1111 修复公路
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1111
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int fa[N];
struct node{
	int a,b,c;
	bool operator < (const node &p)const {return c<p.c;};//重载
}nodes[100005];

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

void merge(int x,int y){
	int a=find(x),b=find(y);
	if(a!=b) fa[a]=b;//还是这么写吧,时间更优一点
}

int main(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;++i) fa[i]=i;
	for(int i=1;i<=m;++i){
		cin>>nodes[i].a>>nodes[i].b>>nodes[i].c;
	}
	sort(nodes+1,nodes+1+m);
	for(int i=1;i<=m;++i){
	    merge(nodes[i].a,nodes[i].b);
	    bool check=true;
	    for(int i=2;i<=n;++i){
	        if(find(i)!=find(i-1)){
	        //这里注意合并完没有merge的fa是没有直接更新的,不能直接比较fa[i]
	        	 check=false;break;
	        }
	    }
	    if(check){
	    	 cout<<nodes[i].c<<endl;return 0;
	    }
	}
	cout<<-1<<endl;
	return 0;
}

这个地方有更优的方法O(m),遍历一遍,如果遇到根节点不同,连通块数量减一并合并,这样连通块数量等于1的时候,输出答案就好了(只需要操作n-1次)

4.P2814 家谱

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2814

这道题我个人结合了map,调到吐血,越改越复杂,细节还是蛮多的(不熟练

#include<iostream>
#include<map>
using namespace std;
const int N=5e4+10;
int fa[N];
map<string,int> mp;//记录每个点的标记
map<int,string> mpp;//在最后返回根节点的字符串
int cnt;

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

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

int main(){
	string s;
	int now;
	while(cin>>s){
		string k=s.substr(1);
		if(s=="$") break;
		else if(s[0]=='#'){
			if(!mp[k]){
				 mp[k]=++cnt;
				 fa[cnt]=cnt;
				 now=cnt;
				 mpp[cnt]=k;
			}
			else now=mp[k]; 
		}
		else if(s[0]=='+'){
			if(!mp[k]){
				 mp[k]=++cnt;
				 fa[cnt]=cnt;
				 mpp[cnt]=k;
			}
			merge(now,mp[k]);
		}
		else{
			int t=find(mp[k]);
//这个地方WA了n发,因为最后步find,这里还保留的是上一次的father,要find一次才能更新
			cout<<k<<' '<<mpp[t]<<endl;
		}
	}	
	return 0;
}

除了我的代码外,这里奉上大佬的一个题解,一样的思路,但是代码简单,炉火纯青。

(我被板子局限了思路,确实没想到路径压缩可以直接压缩map)

5.P1536 村村通

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1536

这道题如果把前面的吃透了,想起本文第三题结尾大佬的一个办法,计算连通块数量,如果find查找的根节点不同,就连通块数量-1并合并,连通块开始初始化为n-1。

// Problem: 
//     P1536 村村通
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1536
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
using namespace std;
const int N=1005;
int fa[N];

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

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

int main(){
    int a,b;
    while(cin>>a){
    	if(a==0) break;
    	for(int i=1;i<=a;++i) fa[i]=i;
    	cin>>b;
    	int ans=a-1;
    	while(b--){
    		int x,y;cin>>x>>y;
    		if(find(x)!=find(y)) ans--,merge(x,y);
    	}
    	if(ans>=0) cout<<ans<<endl;
    	else cout<<0<<endl;
    }	
	return 0;
}

这种方法的初衷其实更适合实时在某一刻卡断一类的,就是说能知道各时刻连通块的数量,这道题其实暴力就可以解决掉(因为给的全部都要操作)

6.P3958 [NOIP2017 提高组] 奶酪

传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P3958非常伤心,这道题卡了我两个钟,最终发现原因(h的范围是1e9,不能直接暴力,写假了)

其实就是一段算成一个点,合并集合,最后把上下两个面再维护一下,看看上下两个面在不在一个集合里,可以配合这篇:远古大神 食用~

// Problem: 
//     P3958 [NOIP2017 提高组] 奶酪
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3958
// Memory Limit: 250 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1003;
#define int long long
int fa[N];
int n,h,r;
struct node{
	int a,b,c;
}nodes[N];
bool check(node x,node y){
	int num=(x.a-y.a)*(x.a-y.a)+(x.b-y.b)*(x.b-y.b)+(x.c-y.c)*(x.c-y.c);
	if(num>(2*r*r*2)) return false;
	return true;
}
int find(int x){
	if(x!=fa[x]) fa[x]=find(fa[x]);
	return fa[x];
}
void merge(int a,int b){
	int x=find(a),y=find(b);
	if(x!=y) fa[y]=x;//高的往低处接
}
signed main(){
	int t;cin>>t;
	while(t--){
		cin>>n>>h>>r;
		for(int i=1;i<=n+2;++i) fa[i]=i;
		for(int i=1;i<=n;++i){
		    cin>>nodes[i].a>>nodes[i].b>>nodes[i].c;
		}
		for(int i=1;i<=n;++i){
			for(int j=i+1;j<=n;++j){
			if(check(nodes[i],nodes[j])){
				merge(i,j);
			}
		}}
		for(int i=1;i<=n;++i){
			if(nodes[i].c-r<=0) merge(i,n+1);
			if(nodes[i].c+r>=h) merge(i,n+2);//看看能不能串起来
		}
		if(find(n+1)==find(n+2)) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

二、提高

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

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

相关文章

OracleXE112、plsqldev1207的安装和基本配置

OracleXE112、plsqldev1207的安装和基本配置 OracleXE112、plsqldev1207的安装和基本配置Oracle安装oracle是什么Oracle两个版本下载安装包 安装OracleXE112_Win64注意&#xff1a;安装到空目录下&#xff1b;输入口令&#xff08;记住啊&#xff01;&#xff09;安装成功&…

基于springboot+vue的在线远程考试系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

别再盲目推广!用Xinstall精准追踪App下载渠道

在移动互联网时代&#xff0c;App推广已经成为企业获取用户、提升品牌知名度的重要手段。然而&#xff0c;面对众多的推广渠道和复杂的用户行为&#xff0c;如何精准统计App下载渠道来源&#xff0c;成为了广告主和开发者亟待解决的问题。今天&#xff0c;我们就来聊聊国内专业…

我的创作周年纪念日

机缘 最初成为创作者的初心&#xff1a;整理自己的知识体系&#xff0c;普及前端知识 实战项目中的经验分享日常工作学习过程中的记录通过文章进行技术交流归纳和整理自己的知识体系 收获 创作的过程中收获&#xff1a; 获得了909粉丝的关注获得了很多正向的反馈&#xff0c…

Leetcoder Day42| 动态规划part09 打家劫舍问题

198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房…

Sleuth(Micrometer)+ZipKin分布式链路追踪

Sleuth(Micrometer)ZipKin分布式链路追踪 Micrometer springboot3之前还可以用sleuth&#xff0c;springboot3之后就被Micrometer所替代 官网https://github.com/spring-cloud/spring-cloud-sleuth 为什么会出现这个技术&#xff1f; 在微服务框架中&#xff0c;一个由客户…

JAVA语言基础 JAVA入门

注释 单行注释&#xff1a;用双斜线 // 表示 多行注释&#xff1a;用 /*------------------*/ 表示 文档注释&#xff1a;用 /**-----------------*/ 表示 分隔符 常见的分隔符有&#xff1a;分号 ; 花括号 {} 方括号 [ ] 圆括号 () 空格 圆点 . 在 Java 语言中每一条…

Linux:文件权限详解及修改方法

文章目录 1、Linux文件权限1.1、如何查看到文件权限1.2、ll命令介绍 2、权限分类2.1、文件权限2.2、文件夹权限 3、权限修改3.1、修改文件/文件夹权限1&#xff09;chmod指令2&#xff09;chmod指令符号 3.2、修改文件/文件夹所属用户3.3、修改文件/文件夹所属群组 4、参考 1、…

CXYGZL实现钉钉、飞书和微信全面覆盖!!!

非常欣慰能在这里与大家分享&#xff0c;CXYGZL已圆满实现多端互通的目标&#xff01;&#xff01;&#xff01; 无论您是在手机、电脑还是平板上使用钉钉、企微还是飞书&#xff0c;只需将CXYGZL轻松集成到您的办公软件中&#xff0c;即可实现无缝审批处理各项任务&#xff0c…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 常用HTML标签(1)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 HTML中的双…

数据结构 - 堆

这篇博客将介绍堆的概念以及堆的实现。 1. 堆的定义&#xff1a; 首先堆的元素按照是完全二叉树的顺序存储的。 且堆中的某个节点总是不大于或不小于其父节点的值。 根节点最大的堆叫做大堆&#xff0c;根节点最小的堆叫小堆。逻辑结构如下图所示&#xff1a; 大堆和小堆的…

Spring揭秘:ApplicationContextAware应用场景及实现原理!

内容概要 ApplicationContextAware接口能够轻松感知并在Spring中获取应用上下文&#xff0c;进而访问容器中的其他Bean和资源&#xff0c;这增强了组件间的解耦&#xff0c;了代码的灵活性和可扩展性&#xff0c;是Spring框架中实现高级功能的关键接口之一。 核心概念 它能用…

腾讯云学生服务器详细介绍_学生服务器价格_学生机申请流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

Java开发从入门到精通(一):Java的基础语法高阶

Java大数据开发和安全开发 &#xff08;一)Java的流程控制1.1 分支语句1.1.1 IF分支语句第一种IF语句第二种IF-ELSE语句第三种IF-ELSE IF-ELSE语句if语句使用的几个常见问题 1.1.2 switch分支语句switch分支的执行流程switch分支的导学案例:电子备忘录if、switch的比较&#xf…

关于JavaScript你该知道的(错误)和不知道的(技巧)

关于JS你该知道的(错误)和不知道的(技巧) 你该知道的(容易犯的错误) 忽略异步函数// Incorrect: Ignoring the asynchronous nature of setTimeout console.log("Start"); setTimeout(() => console.log("Timeout"), 0); console.log("End&q…

【实验】学习实验debug,以及经验感悟

记录两次独立解决问题的过程&#xff1a; 目前来看&#xff0c;问题分为几种&#xff1a; 抄代码的时候抄错了&#xff0c;比如dim1写成dim0这种 逻辑错误&#xff0c;如果两份代码没什么差别的话&#xff0c;那么肯定是逻辑错误。 下面的两个问题都是逻辑错误&#xff0c;因为…

【C++精简版回顾】21.迭代器(未完成)

1.什么是迭代器&#xff1f; 用来遍历容器&#xff0c;访问容器数据。 2.迭代器使用 1.初始化 //初始化 list<int> mylist;//list的整数对象 list<int>::iterator iter;//list内部类&#xff0c;迭代器对象(正向输出) list<int>::reverse_iterator riter;//…

Android使用WebView打开网页链接(内嵌H5网页)的两种方式之一

发布Android应用&#xff0c;除了用原生开发外&#xff0c;更多是采用内嵌H5网页的方式来做&#xff0c;便于更新以及多平台使用。 一、第一种方式是直接通过WebView打开外部H5链接。 新建Android工程 直接创建一个工程&#xff0c;点击运行就可以了&#xff0c;打开是个空页…

PaddlePaddle----基于paddlehub的OCR识别

Paddlehub介绍 PaddleHub是一个基于PaddlePaddle深度学习框架开发的预训练模型库和工具集&#xff0c;提供了丰富的功能和模型&#xff0c;包括但不限于以下几种&#xff1a; 1.文本相关功能&#xff1a;包括文本分类、情感分析、文本生成、文本相似度计算等预训练模型和工具。…

基于springboot精品在线试题库系统论文

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的精品在线试题库系…