首页 > 其他分享 >扩展域并查集详解

扩展域并查集详解

时间:2023-10-24 17:23:02浏览次数:43  
标签:关系 ... 连通 反集 查集 扩展 详解 敌人

如有错漏之处,敬请各位奆佬指正!


这是个比较冷门的数据结构。。。(其实很简单而且并不冷门)

我是在做 P1892 [BOI2003]团伙的时候听说的。

那么,我就来讲解一下这个结构。

upd at 2020-09-17 准备开始扩写这篇文章


一、预备知识

  • 并查集
  • 好像也没了...

所以我说他很菜嘛...

二、引入

咱们做并查集的问题,基本上题面都是这样“三步走”:

  1. n 个点,m 个关系(边)。
  2. 给你这些关系,每个链接两点 x , y 。
  3. 求两点之间是否连通。

当然第三步可能会有一些变更,例如

  • 判断整个图的连通性
  • 统计连通块个数

这些都可以通过一些小优化在 O(1) 的时间内完成处理。

假如在第二步上做一些变更呢?

给定两种关系。第一种:给定一对朋友关系;第二种,给定一对敌人关系,满足敌人的敌人就是朋友。

那么传统并查集就捉襟见肘了。

我们当然可以使用暴力方法(Floyd)在 O(n3) 的时间内把敌人关系预处理成朋友关系。但是这对于题目 n≤1000 的数据量来说是会 T 的。

其实有一种方法能在 O⁡(1) 的时间内优化他。那就是...

三、反集

反集的思路是再构造一个集合(称之为反集),然后将“敌人”关系通过原集和反集表示出来。

比如假设有 3 个元素 1,2,3。我们称他们的反集元素分别为 1′,2′,3′。(如下图)

反集

那么,如何体现敌人关系呢?

假如有一对敌人关系 (1,2)。

我们只需要连接两条边 <1,2′>,<2,1′> 就行了。

这样,在 1,2 之间构成了一个 × 形,由于 1′ 和 2′ 不会相连,所以这在并查集中也就意味着,这两个结点不会连到一起了。(如下图)

反集表示敌人关系

等等!还有一个敌人的敌人就是朋友关系,在这里是否是正确的呢?

假如还有一对敌人关系 (2,3),那么,根据规则,1 与 3应该是朋友关系(在一个集合中)。

我们按照上面的规则,连接 <2,3′> 和 <3,2′>,则图变成了这样:

反集验证敌人的敌人是朋友

则图变成了两个连通块(如下图,红色,蓝色)。

两个连通块

自然地,1,3 在一个连通块中了。

三、实现

在代码中,我们可以开 2×n 的数组,利用 i+n(0<i≤n) 来代替上面的 i′。

代码只需要在并查集的基础上加两个部分即可。

定义:

  • ri​:并查集数组,代表第 i 个元素的代表元素。

初始化

for(int i=1;i<=2*n;i++)//注意这里的2*n。
{
    r[i]=i;
}

 

反集操作

读入结点u,v之间的关系;
if(朋友关系)
{
    union(u,v);
}
else//敌人关系。
{
    //刚刚讲过的操作。
    union(u,v+n);
    union(v,u+n);
}

 

标签:关系,...,连通,反集,查集,扩展,详解,敌人
From: https://www.cnblogs.com/wenyutao1/p/17785337.html

相关文章

  • php-pdo-mysql扩展
    #安装依赖包yuminstallm4yuminstallautoconf#进入对应版本的php安装包的ext/pdo_mysql目录,如下cd/usr/local/src/php-7.4.8/ext/pdo_mysql#在ext/pdo_mysql目录执行phpize/usr/local/php/bin/phpize#执行configure,其中:#--with-pdo-mysql为mysql的安装路径./config......
  • FAST协议详解4 存在图PMap
    一、概述存在图是比较基础但又非常重要的一个设定,如果存在图没搞对后面的解析肯定是有问题的。但要说清楚存在图又必须先搞明白各种数据类型、操作符、可空属性,所以存在图虽然在FAST数据流的最前面但又不得不放到最后来说。 二、存在图的基本设定存在图主要与操作符类型强相关,但又......
  • FAST协议详解5 后记
    这段时间,花了不少精力来学习FAST协议,大致梳理下,相关博文: 1、FAST协议解析1通过输入输出逆解析 2、FAST协议解析2FIXFastTutorial翻译【PMap、copy操作符】 3、FAST协议解析3FIXFastTutorial翻译HelloWorld示例 4、FAST协议详解1不同数据类型的编码与解码 5、FAST协议......
  • servlet 生命周期详解
    servlet程序是由web服务器调用,web服务器实现了对servlet生命周期的管理。当你的应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件,这些事件叫做Servlet的生命周期事件(或方法)。Servlet生命周期可以归纳为:Servlet加载--->实例化--->服务--->销毁周期原......
  • servlet 运行工作原理详解
    Servlet是一门用于开发动态web网页的技术,用于交互式地浏览和修改数据,生成动态Web内容。本文将重点讲解它的工作原理,运行机制是什么。工作原理图工作流程1.WebClient向Servlet容器(Tomcat)发出Http请求2.Servlet容器接收WebClient的请求3.Servlet容器创建一个HttpRequest对象,将W......
  • servlet 入门详解
    Servlet是一种服务器端的编程语言,是J2EE中比较关键的组成部分。Servlet本质上也是Java类,编写Servlet需要遵循java的基本语法,但是与一般的Java类不同的是Servlet是只能运行在服务器端的Java类,而且必须遵循特殊的规范,在运行过程中有自己的生命周期,这些特性都是Servlet所独有的。另外S......
  • servlet service()请求处理方法详解
    service()方法是Servlet的核心,是在servlet生命周期中的服务期,默认在HttpServlet类中实现,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法实现。Servlet接口中定义了一个service()方法,而我们一般是使用HttpServlet,HttpServlet中对它进行了实现,将ServletRequest和Servle......
  • HttpServletRequest客户请求对象详解
    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。方法1.获取客户机信息方法声明功能描述StringgetMethod()该方法用于获取HTTP请求消息中的请求方式(如GET、POST......
  • Servlet Cookie对象详解
    Cookie是服务器发送给浏览器的体积很小的纯文本信息,用户以后访问同一个Web服务器时浏览器会把它们原样发送给服务器。cookie一般用于在线交易过程中标识用户身份、安全要求不高的场合避免用户重复输入名字和密码、门户网站的主页定制、有针对性地投放广告等等。 Servlet中可以同时......
  • Java中Servlet Filter配置(web.xml详解)
    Java中ServletFilter在web.xml中配置时有2个用于过滤器的元素,分别是filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。Filter配置过滤器元素filter元素filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、serv......