Acwing2024蓝桥杯并查集

并查集模板

int n,dad[N],sizee[N];//sizee数组规定只有祖宗结点是有效值
//初始化所有集合
void Init(){for(int i=1;i<=n;i++){dad[i]=i;sizee[i]=1;}return ;
}
//查找a的祖宗节点
int Find(int a){if(dad[a]!=a) dad[a]=Find(dad[a]);//每个集合中只有祖宗节点的值等于自身的值return dad[a];
}
//将a和b的两个数所在的集合合并
void Merge(int a,int b){if(Find(a)==Find(b)) return ;//特判a,b本身就在同一个集合之中//先更新sizee数组再合并sizee[Find(b)]+=sizee[Find(a)];dad[Find(a)]=Find(b);return ;
}
//判断a,b是否在同一个集合之中
bool Check(int a,int b){if(Find(a)==Find(b)) return true;else return false;
}
//统计a所在集合的元素个数
int Count(int a){return sizee[Find(a)];
}

AcWing 528. 奶酪

暴力+并查集: 

#include<iostream>
#include<cmath>
using namespace std;
const int N=1e3+5;
int T,n,h,r,dad[N];
struct point{int px,py,pz;
}p[N];
int find(int a){if(dad[a]!=a) dad[a]=find(dad[a]);return dad[a];
}
void merge(int a,int b){if(find(a)==find(b)) return ;else dad[find(a)]=find(b);
}
bool query(int a,int b){if(find(a)==find(b)) return true;else return false;
}
int main(){cin>>T;while(T--){cin>>n>>h>>r;for(int i=1;i<=n;i++){cin>>p[i].px>>p[i].py>>p[i].pz;dad[i]=i;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i!=j){double d=sqrt(pow(p[i].px-p[j].px,2)+pow(p[i].py-p[j].py,2)+pow(p[i].pz-p[j].pz,2));if(d<=2*r){merge(i,j);}}}}int flag=0;for(int i=1;i<=n;i++){if(p[i].pz<=r){for(int j=1;j<=n;j++){if(p[j].pz>=h-r){if(query(i,j)) {flag=1;break;}}}}}if(flag==0) cout<<"No"<<endl;else cout<<"Yes"<<endl;}return 0;
}

AcWing 836. 合并集合

#include<iostream>
using namespace std;
const int N=1e5+5;
int n,m,dad[N];
void init(){for(int i=1;i<=n;i++) dad[i]=i;return ;
}
int find(int a){if(dad[a]!=a) dad[a]=find(dad[a]);return dad[a];
}
void merge(int a,int b){if(find(a)==find(b)) return ;else dad[find(a)]=find(b);return ;
}
void query(int a,int b){if(find(a)==find(b)) cout<<"Yes"<<endl;else cout<<"No"<<endl;return ;
}
int main(){cin>>n>>m;init();while(m--){char ch;int a,b;cin>>ch>>a>>b;if(ch=='M') merge(a,b);else query(a,b);}return 0;
}

AcWing 837. 连通块中点的数量

注意这里先改变集合的数量,再改变集合的祖宗
sizee[find(b)]+=sizee[find(a)];
dad[find(a)]=find(b);
#include<iostream>
using namespace std;
const int N=1e5+5;
int n,m,dad[N],sizee[N];
void init(){for(int i=1;i<=n;i++) dad[i]=i,sizee[i]=1;return ;
}
int find(int a){if(dad[a]!=a) dad[a]=find(dad[a]);return dad[a];
}
void merge(int a,int b){if(find(a)==find(b)) return ;else{//注意这里先改变集合的数量,再改变集合的祖宗sizee[find(b)]+=sizee[find(a)];dad[find(a)]=find(b);return ;}
}
void query(int a,int b){if(find(a)==find(b)) cout<<"Yes"<<endl;else cout<<"No"<<endl;return ;
}
int count(int a){return sizee[find(a)];
}
int main(){cin>>n>>m;init();while(m--){string s;cin>>s;if(s=="C"){int a,b;cin>>a>>b;merge(a,b);}else if(s=="Q1"){int a,b;cin>>a>>b;query(a,b);}else{int a;cin>>a;cout<<count(a)<<endl;}}return 0;
}

AcWing 2069. 网络分析(第十一届省赛)

暴力+并查集(超时未AC 70points):

#include<iostream>
using namespace std;
const int N=1e4+5;
int n,m,dad[N],sizee[N];
void init(){for(int i=1;i<=n;i++) dad[i]=i;
}
int find(int a){if(dad[a]!=a) dad[a]=find(dad[a]);return dad[a];
}
void merge(int a,int b){if(find(a)==find(b)) return ;else dad[find(a)]=find(b);
}
bool query(int a,int b){if(find(a)==find(b)) return true;else return false;
}
void count(int a,int t){for(int i=1;i<=n;i++){if(find(i)==find(a)){sizee[i]+=t;}}
}
int main(){cin>>n>>m;init();while(m--){int x,y,z;cin>>x>>y>>z;if(x==1) merge(y,z);else count(y,z);}for(int i=1;i<=n;i++) cout<<sizee[i]<<" ";return 0;
}

优化树上差分+并查集:

#include<iostream>
using namespace std;
const int N=1e4+5;
int n,m,dad[N],ans[N];
void init(){for(int i=1;i<=n;i++) dad[i]=i;
}
int find(int a){//路径压缩之后,父节点就是根节点//因此两种情况直接返回:一个是根节点本身,另一个是节点和他的父结点if(dad[a]==a||dad[dad[a]]==dad[a]) return dad[a];int temp=find(dad[a]);ans[a]+=ans[dad[a]];dad[a]=temp;return temp;
}
void merge(int a,int b){if(find(a)==find(b)) return ;else{ans[find(a)]-=ans[find(b)];//保证a中的子树节点值不变dad[find(a)]=find(b);}
}
void count(int a,int t){ans[find(a)]+=t;
}
int main(){cin>>n>>m;init();while(m--){int x,y,z;cin>>x>>y>>z;if(x==1) merge(y,z);else count(y,z);}for(int i=1;i<=n;i++){//根节点就直接输出权值if(i==find(i)) cout<<ans[i]<<" ";//每个节点的权值就等于该点的权值加上根节点的权值else cout<<ans[i]+ans[find(i)]<<" ";}return 0;
}

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

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

相关文章

你认识edge吗,edge是做什么的

简介 Microsoft Edge&#xff08;研发代号为Project Spartan&#xff0c;又译作微软边缘浏览器&#xff0c;Edge浏览器&#xff09;是一个由微软研发的基于Chromium开源项目及其他开源软件的网页浏览器&#xff0c;于2015年1月21日公布&#xff0c;2015年3月30日公开发布第一个…

pyqt曲线轨迹运动

pyqt曲线轨迹运动 pyqt QPropertyAnimation介绍曲线轨迹运动代码 pyqt QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c…

闭散列哈希表

一、什么是 哈希 &#xff1f; 1.1 哈希概念 与 哈希冲突 在正式介绍闭散列哈希之前&#xff0c;我们需要明确 哈希 的概念。 哈希 &#xff1a;构造一种数据存储结构&#xff0c;通过函数 HashFunc() &#xff0c;使 元素的存储位置 与 其对应的键值 建立一一映射关系&…

国产开源物联网操作系统

软件介绍 RT-Thread是一个开源、中立、社区化发展的物联网操作系统&#xff0c;采用C语言编写&#xff0c;具有易移植的特性。该项目提供完整版和Nano版以满足不同设备的资源需求。 功能特点 1.内核层 RT-Thread内核包括多线程调度、信号量、邮箱、消息队列、内存管理、定时器…

JVM基础之垃圾回收

垃圾回收 1. Base 内存泄漏&#xff1a;不再使用的对象在系统中未被回收 内存溢出&#xff1a;内存泄漏的积累 手动触发垃圾回收&#xff1a;System.gc(),该方法不一定会立即回收垃圾&#xff0c;仅仅是向JVM发送一个垃圾回收请求&#xff0c;具体是否需要垃圾回收由JVM自行…

项目ElasticSearch 6.8 安装配置

配置文件位置: 程序配置文件&#xff1a;/etc/elasticsearch/elasticsearch.ymljvm配置文件&#xff1a;/etc/elasticsearch/jvm.options 1. 确认基础环境 确认主机limit相关参数 grep vm.max_map_count /etc/sysctl.conf && sed -i "svm.max_map_count.*vm.m…

使用php和redis实现分布式锁

实现分布式锁是在分布式环境中确保资源独占性的重要手段。在这里&#xff0c;我将使用 PHP 和 Redis 来展示如何实现基于 Redis 的分布式锁。 首先&#xff0c;我们需要使用 Redis 的 SET 指令来尝试获取锁&#xff0c;并设置一个过期时间&#xff0c;确保锁不会永久存在。在 …

怎么找回回收站里删除的XLS文件?5个恢复方法

我们经常会使用到XLS文件来存储和整理数据。然而有时候由于误操作或不小心&#xff0c;我们可能会将重要的XLS文件删除&#xff0c;并且这些文件可能还被清空出了回收站。面对这种情况许多人会感到焦虑和无助。但是不必过于担心&#xff0c;因为有专门的软件可以帮助我们找回这…

(Java)心得:LeetCode——5.最长回文子串

一、原题 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba"…

神经网络的偏见

神经网络的偏见 前言 神经网络是人工智能和深度学习的核心技术之一&#xff0c;当前的各种大模型和人工智能程序都使用了神经网络技术。 对人类来说&#xff0c;神经网络能根据人类输入的大量数据&#xff0c;实现人类训练模型的目的。但是&#xff0c;神经网络对人类来说是…

【Linux】什么是进程?

一个正在执行的程序&#xff0c;我们称之为进程。 然后我们来顺着一条线来思考。 操作系统底层是用C语言编写的&#xff0c;而我们的进程&#xff0c;它会有各种属性&#xff0c;那么各种属性就可以用一个结构体来对进程的各个属性进行描述&#xff0c;然后这个结构体里面&…

手写一个SPI FLASH 读写擦除控制器(未完)

文章目录 flash读写数据的特点1. 扇擦除SE&#xff08;Sector Erase&#xff09;1.1 flash_se 模块设计1.1.1 信号连接示意图&#xff1a;1.1.2 SE状态机1.1.3 波形图设计&#xff1a;1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图&#xff1a;…

Soviet Kitchen

苏联厨房-具有道具和带有碰撞器的模块化建筑部件的游戏环境资产 内部资产包: 网格-253 前言-98 材料-26 纹理-116 网格格式-(FBX) 纹理格式-(PNG) 资产列表: _BigShelf 多边形计数-1986 文本大小-2048x2048 可以 多边形计数-277 结构尺寸-512x512 _Celling 多边形计数-1 …

Codeforces Round 217 (Div. 2) A. Rook, Bishop and King(BFS)

Rook, Bishop and King 题面翻译 【题目描述】 佩蒂亚正在学习国际象棋。他已经学会如何移动王、车和象。让我们提示你如何移动国象棋子。棋盘有 64 64 64个棋格&#xff0c;呈 8 8 8\times8 88正方形。一个格子可以用 ( r , c ) (r,c) (r,c)来表示—— r r r指行&#xff…

Stable Diffusion的技术原理

一、Stable Diffusion的技术原理 Stable Diffusion是一种基于Latent Diffusion Models&#xff08;LDMs&#xff09;实现的文本到图像&#xff08;text-to-image&#xff09;生成模型。其工作原理主要基于扩散过程&#xff0c;通过模拟数据的随机演化行为&#xff0c;实现数据…

回表的原理竟然这么简单

“回表” 是指在使用辅助索引&#xff08;非聚簇索引&#xff09;作为条件进行查询时&#xff0c;由于辅助索引中只存储了索引字段的值和对应的主键&#xff08;聚簇索引&#xff09;键值&#xff0c;因此需要根据主键&#xff08;聚簇索引&#xff09;中的键值去查找实际的数据…

verilog中含有无关项的序列检测

编写一个序列检测模块&#xff0c;检测输入信号a是否满足011XXX110序列&#xff08;长度为9位数据&#xff0c;前三位是011&#xff0c;后三位是110&#xff0c;中间三位不做要求&#xff09;&#xff0c;当信号满足该序列&#xff0c;给出指示信号match。 程序的接口信号图如…

vue+onlyOffice+java : 集成在线编辑word并保存

1.docker部署onlyOffice 1.1拉取最新版onlyOffice镜像 sudo docker pull onlyoffice/documentserver 1.2运行以下命令运行容器 其中 -v 后的第一部分是挂载自己的linux的哪个目录 # 启动docker容器&#xff0c;默认启动端口为80&#xff0c;可以进行修改 docker run -i -t …

[补题记录] StarryCoding 入门教育赛3 D.电弧陷阱

URL&#xff1a;小白教育赛3 题目描述 劳 e e e和桶子在打派的时候被一个艾许的电弧陷阱控在原地动弹不得&#xff0c;于是他们想办法找出哪些地方是可以去的&#xff0c;哪些地方是不能去的。 给定一个由字符构成的 N ∗ M N * M N∗M的矩阵&#xff0c;其中包括&#xff1…

Python 中的 Lambda 函数:简单、快速、高效

大家好&#xff0c;今天再给大家介绍一个python的一个强大工具Lambda 函数&#xff0c;它允许你快速定义简单的匿名函数。这种函数是“匿名的”&#xff0c;因为它们不需要像常规函数那样被明确命名。 在本文中&#xff0c;我们将通过清晰的解释和实用的示例&#xff0c;深入了…