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.mfbz.cn/a/611408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【进程替换】进程程序替换函数execl | 单进程程序替换原理

目录 直接看现象&#xff08;单进程&#xff09; 单进程程序替换原理 替换函数 直接看现象&#xff08;单进程&#xff09; 我们先使用execl来直接看现象man 3 execlexecute a file执行一个程序int execl(const char *path, const char *arg, ...);execl函数的返回值&#x…

使用GitLab自带的CI/CD功能在K8S集群里部署项目(四)

前置内容&#xff1a; 通过Docker Compose部署GitLab和GitLab Runner&#xff08;一&#xff09; 使用GitLab自带的CI/CD功能在本地部署项目&#xff08;二&#xff09; 使用GitLab自带的CI/CD功能在远程服务器部署项目&#xff08;三&#xff09; 一、K8S集群信息 节点名称…

Unity TileMap入门

概述 相信很多同学学习制作游戏都是从2D游戏开始制作的吧&#xff0c;瓦片地图相信大家都有接触&#xff0c;那接下来让我们学习一下这部分的内容吧&#xff01; Tilemap AnimationFrameRate:设置每帧动画的播放速率。Color:瓦片地图的颜色TileAnchor:锚点&#xff0c;&#x…

笔试强训week4

day1 Q1 难度⭐⭐ 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防…

马斯克:脑机接口迎来首例植入者,芯片接线发生故障。

马斯克旗下的脑机接口公司Neuralink近日传出关于首例植入者诺兰阿博脑机接口芯片故障的消息。根据Neuralink发布的文章&#xff0c;诺兰阿博的脑机设备发生了故障&#xff0c;多根植入他大脑的接线已经脱落&#xff0c;导致获取数据量减少。目前该公司正在研究导致接线脱落的原…

Java进阶08 集合(续)Stream流

Java进阶08 集合&#xff08;续&#xff09;&Stream流 一、HashSet集合类&#xff08;续&#xff09; 1、JDK7(-)HashSet原理解析 1.1 底层结构 数组链表 1.2 执行过程 ①创建一个默认长度为16的数组&#xff0c;数组名为table ②根据元素的哈希值跟数组的长度求余计…

灰狼优化算法(Grey Wolf Optimizer)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法引言 灰狼算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种受自然界灰狼行为启发的优化算法。它模拟了灰狼的社会层次和狩猎策…

JS实现初始化、动态点击切换激活样式

食用须知&#xff0c;不懂得把代码交给AI解释一下&#xff0c;明白流程就会用了&#xff0c;本文只有js与html&#xff0c;样式代码一概没有&#xff1a; 效果展示 1、点击显示的盒子代码 <div data-v-e1dd37c4"" class"news-container main-width-contain…

JAVA获取application.yml配置文件的属性值

application.yml配置参数 方式一&#xff1a;使用Value方式(常用) 语法 Value("${配置文件中的key:默认值}") Value("${配置文件中的key}")方法1&#xff1a;使用的类文件中定义变量&#xff0c;直接使用变量 import org.springframework.beans.factory.an…

通义千问2.5中文能力地表最强

随着人工智能技术的不断进步&#xff0c;智能问答系统已成为人们日常生活中不可或缺的一部分。阿里巴巴集团作为全球领先的科技公司&#xff0c;一直致力于AI领域的研发和创新。最近&#xff0c;阿里巴巴发布了其最新的智能问答系统——通义千问2.5。 通义千问2.5在AI问答领域…

抖音新店怎么对接达人?对接达人秘籍流程分享,让你学会找达人

大家好&#xff0c;我是电商花花。 新手怎么对接达人带货&#xff1f;这是我们新手商家 要考虑的问题。 很多新手抱怨自己新店铺不出单&#xff0c;没有销量&#xff0c;对接达人又怕达人看不上&#xff0c;没有达人愿意帮我带货&#xff0c;在面临这样的情况下不知道该怎么办…

基于自我对弈框架的偏好优化算法SPPO

传统的从人类反馈中进行强化学习&#xff08;RLHF&#xff09;的方法仰赖如Bradley-Terry模型等参数模型,但这样的模型难以充分捕捉人类偏好中的非递移性和非理性。最新的研究进展显示,直接使用偏好机率可以更准确地反映人类偏好,从而实现更灵活、更精确的语言模型对齐。本文提…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击&#xff08;Session Hijacking&#xff09;是一种网络攻击方式&#xff0c;攻击者通过某种手段获取到用户的会话标识&#xff08;Session ID&#xff09;&#xff0c;然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…

Go语言系统学习笔记(一):基础篇

1. 写在前面 公司的新业务开发需要用到go语言&#xff0c;虽然之前没接触过这门语言&#xff0c;但在大模型的帮助下&#xff0c;边看项目边写代码也能进行go的项目开发&#xff0c;不过&#xff0c;写了一段时间代码之后&#xff0c;总感觉对go语言本身&#xff0c;我的知识体…

Python尝试安装 pyaudio 时遇到的错误信息表示安装过程失败,原因是找不到 Python.h 头文件

环境&#xff1a; Python 3.8.10 WSL2 问题描述&#xff1a; 尝试安装 pyaudio 时遇到的错误信息表示安装过程失败&#xff0c;原因是找不到 Python.h 头文件 error: subprocess-exited-with-error Building wheel for pyaudio (pyproject.toml) did not run successfully…

【数据结构】手把手带你玩转线性表

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

Ubuntu 安装 samba 实现文件共享

1. samba的安装: sudo apt-get install samba sudo apt-get install smbfs2. 创建共享目录 mkdir /home/share sudo chmod -R 777 /home/share3. 创建Samba配置文件: 3.1 保存现有的配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak3.2 打开现有的文件 sudo…

基于小波交叉谱分析的地震波走时变化测量(MATLAB)

地震波在地球介质中传播&#xff0c;带来了丰富的地下介质物性的信息&#xff0c;为了解地球内部结构及运动变化提供了可能。地球内部地震波速度的差异是人们确定地球圈层结构和横向不均匀性的重要物理参数&#xff0c;地下介质应力的变化和积累是地震的孕育和发生的原因&#…

百面算法工程师 | 传统图像处理——OpenCV

本文给大家带来的百面算法工程师是传统图像处理的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将介绍一些集几何变换和图像平滑处理&#xff0c;并提供参考的回答及其理论基础&…

分布式与集群的区别

先说区别&#xff1a; 分布式是并联工作的&#xff0c;集群是串联工作的。 分布式中的每一个节点都可以做集群。而集群并不一定就是分布式的。 集群举例&#xff1a;比如新浪网&#xff0c;访问的人很多&#xff0c;他可以做一个集群&#xff0c;前面放一个相应的服务器&…
最新文章