种类并查集

最近玩的太嗨了,都忘了自己还有三篇博客还在拖更,也是今天一更到底好吧,边更新边写题,让看官老爷有更多的样题去联系

引入——

在学这个之前,我相信各位应该已经接触过了并查集了吧,嗯?什么?没有看过怎么办,那还不赶紧看,跳转链接——http://t.csdnimg.cn/Y880W

好了,那么现在应该都是学过的人了吧,OK,先来讲解种类并查集并查集的不同的地方,众所周知,我们的并查集只能判断一种关系,是否和我在同一个集合,是或者不是,但是我们的种类并查集可以判断多种关系,比如说“朋友的朋友不一定是朋友,敌人的敌人有可能是朋友”这种关系,我们有多种关系,那么就轮到我们的种类并查集出马了

我们只需要开n*种类关系个大小  的数组空间即可,1~n表示第一种关系,n+1~2*n表示第二种关系,以此类推

一般的并查集,维护的是具有连通性、传递性的关系,例如亲戚的亲戚是亲戚。但是,有时候,我们要维护另一种关系:敌人的敌人是朋友。种类并查集就是为了解决这个问题而诞生的。

好了,这个说我,我们该进入实战环节了

例题

240. 食物链

思路:

如果x的同类属于某个集合find(x)内,
那么吃x的,即x的天敌,应该属于集合find(x+n)内,
那么x吃的,即x的猎物,应该属于集合find(x+2*n)内

判断1:如果x和y是同类
那么find(x)应该等于find(y),
x,y关系之前如果已经确定,需要判断是否下面情况,则说明说谎
1.find(x)==find(y+n)
2.find(x)==find(y+2*n)
x,y关系之前如果没有确定
p[find(x)]=find(y)
p[find(x+n)]=find(y+n)
p[find(x+2*n)]=find(y+2*n)

判断2:如果x吃y,x是y的天敌
那么find(x)应该等于find(y+n)
x,y关系之前如果已经确定,需要判断是否下面情况,则说明说谎
1.如果x=y-->x自己吃自己
2.find(x)==find(y)-->x和y同类
3.find(x)==find(y+2*n)-->y是x的天敌
x,y关系之前如果没有确定
p[find(x)]=find(y+n)
p[find(x+n)]=find(y+2*n)->x的天敌是y的猎物
p[find(x+2*n)]=find(y)->x的猎物是y的同类

#include<bits/stdc++.h>
using namespace std;
#define int long long int n,k;
int cnt;
int d,x,y;
int f[200005];int cha(int x)
{if(x==f[x])return x;return f[x]=cha(f[x]);
}signed main()
{cin>>n>>k;for(int i=1;i<=3*n;i++){f[i]=i;}for(int i=1;i<=k;i++){cin>>d>>x>>y;if(x>n||y>n){cnt++;continue;}else if(d==1)//如果是同类 {if(cha(x)==cha(y+n)){cnt++;continue;}if(cha(x)==cha(y+2*n)){cnt++;continue;}f[cha(x)]=cha(y);f[cha(x+n)]=cha(y+n);f[cha(x+2*n)]=cha(y+2*n);}else if(d==2)//如果是天敌{if(cha(x)==cha(y)){cnt++;continue;} if(cha(x)==cha(y+2*n)){cnt++;continue;}f[cha(x)]=cha(y+n);f[cha(x+n)]=cha(y+2*n);f[cha(x+2*n)]=cha(y);} }cout<<cnt;return 0;
}

P5937 [CEOI1999] Parity Game

用 𝑓[𝑖] 表示与自己奇偶性相同的集合,用]f[i+n] 表示与 𝑖i 奇偶性不同的元素集合。 

用区间关系来确定奇偶性是否相同

#include<bits/stdc++.h>
using namespace std;
#define int long longint n,m;
struct node{int l;int r;int flag;
}a[5005];
int f[20005];
int b[20005];
string s;
int cha(int x)
{if(f[x]==x){return x;}return f[x]=cha(f[x]);
}void bing(int a,int b)
{f[cha(a)]=cha(b);return ;
}signed main()
{cin>>n>>m;for(int i=1;i<=m;i++){cin>>a[i].l>>a[i].r>>s;a[i].l--;if(s[0]=='o'){a[i].flag=1;}else{a[i].flag=2;}b[i]=a[i].l;b[i+1]=a[i].r;}sort(b+1,b+1+2*n);int len=(b+1,b+1+2*n)-(b+1);for(int i=1;i<=len*2;i++)//开双倍空间,有两种状态 {f[i]=i;}for(int i=1;i<=m;i++){a[i].l=lower_bound(b+1,b+1+len,a[i].l)-b;a[i].r=lower_bound(b+1,b+1+len,a[i].r)-b;if(a[i].flag==2)//区间奇偶性为偶数 {if(cha(a[i].l)==cha(a[i].r+len))//奇偶性不同,则是矛盾的 {cout<<i-1;return 0;}else{bing(a[i].l,a[i].r);bing(a[i].l+len,a[i].r+len);}}else{if(cha(a[i].l)==cha(a[i].r))//奇偶性不同,则是矛盾的 {cout<<i-1;return 0;}else{bing(a[i].l,a[i].r+len);bing(a[i].l+len,a[i].r);}}}cout<<m;return 0;
}

P1525 [NOIP2010 提高组] 关押罪犯

思路:先按照贪心对事件影响力从大到小进行排序,然后f[ i ]表示在一个监狱,f [ i +n]表示不在一个监狱,我们想要影响力最小,那肯定就要把排在前面的争取拉到不同的监狱,直到同处同一个监狱则直接输出当前事件影响力即可,如果一直没有发生冲突则输出0

 

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
struct node{int a,b,c;
}q[100005];
int f[40005];
bool cmp(node x,node y)
{return x.c>y.c;
}
int cha(int x)
{if(f[x]==x)return x;return f[x]=cha(f[x]);
}
void bing(int a,int b)
{f[cha(a)]=cha(b);return ;
}
signed main()
{cin>>n>>m;for(int i=1;i<=m;i++){cin>>q[i].a>>q[i].b>>q[i].c;}sort(q+1,q+1+m,cmp);for(int i=1;i<=2*n;i++){f[i]=i;}for(int i=1;i<=m;i++){if(cha(q[i].a)==cha(q[i].b)||cha(q[i].a+n)==cha(q[i].b+n)){cout<<q[i].c;return 0;}bing(q[i].a+n,q[i].b);bing(q[i].a,q[i].b+n);}cout<<0;return 0;
}

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

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

相关文章

Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O

在本系列的上一篇文章中&#xff0c;我们讨论了什么是 CRI 和 OCI&#xff0c;Docker、containerd、CRI-O 之间的区别以及它们的架构等。最近&#xff0c;我们得知 Docker 即将从 kubernetes 中弃用&#xff01;&#xff08;查看 kubernetes 官方的这篇文章&#xff09;那么让我…

VSCODE 下 openocd Jlink 的配置笔记

title: VSCODE 下 openocd Jlink 的配置笔记 tags: STM32HalCubemax 文章目录 内容VSCODE 下 openocd Jlink 的配置笔记安装完成后修改jlink的配置文件然后修改你的下载器为jlink烧录你的项目绝对会出现下面的问题那么打开下载的第一个软件 &#xff08;点到这个jlink右键&…

Kafka架构详解之分区Partition

目录 一、简介二、架构三、分区Partition1.分区概念2.Offsets&#xff08;偏移量&#xff09;和消息的顺序3.分区如何为Kafka提供扩展能力4.producer写入策略5.consumer消费机制 一、简介 Apache Kafka 是分布式发布 - 订阅消息系统&#xff0c;在 kafka 官网上对 kafka 的定义…

【11】微服务链路追踪SkyWalking

1、skywalking是什么 1.1 链路追踪介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统&#xff0c;通常会遇到下面一些问题&#xff0c;比如&#xff1a; 如何串联整个调用链路&#xff0c;快速定位问题&#xff1f;如何缕清各个微服务之间的依赖关系&#xff1f;…

【AI学习】LLaMA 系列模型的进化(二)

在前面LLaMA 系列模型的进化&#xff08;一&#xff09;中学习了LLama模型的总体进化发展&#xff0c;再来看看其中涉及的一些重要技术。 PreLayerNorm Layer Norm有Pre-LN和Post-LN两种。Layer Normalization&#xff08;LN&#xff09;在Transformer架构中的放置位置对模型…

基于PaddleOCR + NLP实现证件识别

基于PaddleOCR NLP实现证件识别 PaddleOCR识别paddleOCR安装安装 anconda虚拟环境(可参考yolov5的安装教程) paddleOCR识别PaddleNLP模型信息抽取paddle打包exe 进行ocr识别 什么是PaddleOCR&#xff1f; PaddleOCR 旨在打造一套丰富、领先、且实用的 OCR 工具库&#xff0c;助…

【HarmonyOS开发】Navigation使用

简介 Navigation是路由容器组件&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。适用于模块内和跨模块的路由切换。 在页面跳转时&#xff0c;应该使用页面路由router&#xff0c;在页面内的页面跳转时&#xff0c;建议使用Navigation达到更好的转场动效…

Spring Boot集成Spring Batch快速入门Demo

1.什么是Spring Batch&#xff1f; Spring Batch 是一个轻量级的开源框架&#xff0c;它提供了一种简单的方式来处理大量的数据。它基于Spring框架&#xff0c;提供了一套批处理框架&#xff0c;可以处理各种类型的批处理任务&#xff0c;如ETL、数据导入/导出、报表生成等。S…

Armv8/Armv9架构的学习大纲-学习方法-自学路线-付费学习路线

本文给大家列出了Arm架构的学习大纲、学习方法、自学路线、付费学习路线。有兴趣的可以关注&#xff0c;希望对您有帮助。 如果大家有需要的&#xff0c;欢迎关注我的CSDN课程&#xff1a;https://edu.csdn.net/lecturer/6964 ARM 64位架构介绍 ARM 64位架构介绍 ARM架构概况…

uniapp,vue3上传图片组件封装

首先创建一个 components 文件在里面进行组件的创建 下面是 vip组件的封装 也就是图片上传组件 只是我的命名是随便起的 <template><!--图片 --><view class"up-page"><!--图片--><view class"show-box" v-for"(item,ind…

蓝桥杯Python算法竞赛常用的函数库

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;Python关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ ​ 目录 math collectcions heapq functool itertools 常用的库函数 m…

web服务器1

&#xff08; 1 &#xff09;仅提供用户浏览的单向静态网页 单纯是由服务器单向提供数据给客户端&#xff0c; Server 不需要与 client 端有互动&#xff0c;所以你可以到该网站上去浏 览&#xff0c;但是无法进行数据的上传。 &#xff08; 2 &#xff09;提供用户互动接口的…

深入理解Linux网络(三):TCP对象创建

深入理解Linux网络&#xff08;三&#xff09;&#xff1a;TCP对象创建 TCP对象创建inet_createsock_init_data TCP对象创建 常见的三句TCP编程&#xff1a; int main() {int sk socket(AF_INET, SOCK_STREAM, 0);connect(sk, ...)recv(sk, ...) }简单的两三⾏代码&#xff…

十年前的老电脑能装win10吗_十年前的老电脑用U盘安装win10教程

十年前的老电脑能装win10吗&#xff1f;十年前的老电脑只要满足win10最低要求的配置都可以安装win10。安装win10方法很多&#xff0c;有一键重装方法、U盘安装、硬盘安装等方式&#xff0c;但最靠谱的方式还是U盘安装。十年前的老电脑用U盘安装win10首先要将u盘制作成u盘启动盘…

react自定义校验报错问题修复 ProFormText

1、以下是tsx组件 自定义校验告警导致表单无法提交问题修复 修改如下&#xff1a;

体态识别开发记录

1.多标签输出分类算法 https://aiuai.cn/aifarm1372.html 2.体态识别算法 体态对比 体态判断 2.1 3D建模的方案 stable diffusion 插件地址&#xff1a; ControlNet https://github.com/Mikubill/sd-webui-controlnet 3D Openpose https://github.com/nonnonstop/sd…

VsCode SSH远程连接服务器【内网穿透公网连接】

文章目录 1.前言2.VS code的安装和设置2.1 VS code的下载安装2.2 OpenSSH的启用2.3 为VS code配置ssh2.4 局域网内测试VS code的ssh连接2.5 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 记得笔者小时候看电视&#xff…

仿源码大师主界面UI的iAPP源文件

仿源码大师首页主界面的布局 首页&#xff0c;分类&#xff0c;需求&#xff0c;我的 就只有这几个界面内容而已 资源静态 没有任何动画和功能 纯UI布局 纯UI布局 他的最新版已经不是这个UI布局 放心使用 以学习参考为目的&#xff0c;如有不妥望告知 原创&#xff0c;纯…

【Java数据结构】线性表之栈和队列

栈&#xff08;Stack&#xff09; 简单描述 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&…

初识网络基础知识

关于网络的一些核心概念 局域网 局域网&#xff08;Local Area Network&#xff0c;简称LAN&#xff09;是一种计算机网络&#xff0c;覆盖的范围通常是相对较小的地理区域&#xff0c;比如一个办公室、一栋大楼或一个校园。 局域网的组成通常包括以下部分&#xff1a; 网络…