首页 > 其他分享 >并查集

并查集

时间:2024-10-08 20:12:17浏览次数:9  
标签:stackrel 查集 缝隙 fa 带权 longrightarrow

1. 并查集

每次合并两个不相交集合,或者询问两个元素是否在同一个集合里。

洛谷 P1197 [JSOI2008] 星球大战

给一张图,每次删掉一个点及相连的边,求剩下的图中的联通块数。

我们倒着从空图往回做,就变成了加边求联通块数的问题。

洛谷 P1525 [NOIP2010 提高组] 关押罪犯

有一张图,边有边权。你要给每个点确定是黑色或者白色,使得两端颜色相同的边的边权最大值最小。

solution 1

一个直观想法是尽可能让边权大的边,两端颜色不同。因此我们从大到小加边,由于不能确定两端点是什么颜色,考虑用并查集维护一个相对关系,就是敌人的敌人是朋友这种感觉,如果一条边两端点在同一集合,直接输出即可。

solution 2

考虑二分,假设二分到一个 \(\texttt{mid}\),如果大于 \(\texttt{mid}\) 的边构成一个二分图就是可行的。

带权并查集

维护当前节点 \(x\) 与其父亲的关系。

P2024 [NOI2001] 食物链

有三种生物 \(A,B,C\),其中 \(A\) 吃 \(B\),\(B\) 吃 \(C\),\(C\) 吃 \(A\)。
有 \(n\) 个生物,每个要么是 \(A\),要么 \(B\),要么 \(C\)。
每次告诉你谁吃谁或者谁和谁同类,或者问你谁吃谁/谁和谁同类是否一定不成立。

使用带权并查集,维护节点 \(x\) 与其父亲 \(fa\) 的关系,记为 \(d_x\):

  • 如果 \(d_x=0\),那么 \(x\) 与其父亲 \(fa\) 是同类。
  • 如果 \(d_x=1\),那么 \(x\) 吃 \(fa\)。
  • 如果 \(d_x=2\),那么 \(x\) 被 \(fa\) 吃。

一些神奇的性质就是:

  • \(A \stackrel{s_1}{\longrightarrow} B \stackrel{s_2}{\longrightarrow} C \Rightarrow A \stackrel{s_1+s_2}{\longrightarrow} C\)
  • \(A \stackrel{s_1}{\longrightarrow} B \Rightarrow B \stackrel{-s_1}{\longrightarrow} A\)

(以上运算都是在模 \(3\) 意义下进行的)

之后再合并/路径压缩的时候用上述性质讨论一下就可以了,不再赘述。

P8779 [蓝桥杯 2022 省 A] 推导部分和

有一列数字,每次告诉你一个区间的和,或者问能否确定一个区间的和。

考虑两两元素之间的缝隙,共有 \(n+1\) 个缝隙(加上第一个元素之前的和第 \(n\) 个元素之后的)。依次编号,告诉你一个区间的和本质上就是在讲从一个缝隙走到另一个缝隙的距离。例如 \(l \sim r\) 的和是 \(s\) 就是第 \(l\) 个缝隙到 \(r+1\) 个缝隙的距离是 \(s\)。考虑带权并查集,与上一题的做法基本类似。

将某些区间问题视作关于缝隙的图是一类特殊技巧,有必要掌握一下。

标签:stackrel,查集,缝隙,fa,带权,longrightarrow
From: https://www.cnblogs.com/zhuluoan/p/18452411

相关文章

  • 深度优先搜索与并查集
    一:深度优先搜索示例1题目链接:886.可能的二分法-力扣(LeetCode)首先可以构建一个图的邻接表表示,然后使用深度优先搜索(DFS)算法来检查图是否可以二分。如果图可以二分,则返回True;否则返回False。具体步骤如下:构建图:使用一个列表 graph 来存储每个节点的邻接节点。初始化......
  • Codeforces2020D Connect the Dots(观察 + 并查集 + 差分)
    题意多组数据。数轴上有\(n\)个点,编号为\(1\simn\),对这些点做$m$次操作。每次操作给出三个整数\(a_i(1\lea_i\len)\\\d_i(1\led_i\le10)\\\k_i(0\lek_i\len)\)。将点\(a_i,a_i+d_i,a_i+2\timesd_i,a_i+3\timesd_i,\cdot\cdot\cdo......
  • 食物链(并查集)
    一开始默认为0,如果有捕食关系调整d[x]#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;ty......
  • [CEOI1999] Parity Game(并查集)
    方法1:带权路径维护本题核心:[a,b]之间有奇数个1转换为s[a-1]^s[b]=1,从而转向并查集#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedint......
  • [NOI2002] 银河英雄传说(带权并查集)
    带权并查集稍微注意下细节、#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefve......
  • Supermarket(并查集)
    考虑利润从高到底排序,优先把利润最高的填到最接近过期的空余位置贪心证明:如果当前a[i]被填入而填入了比最靠近过期前面的位置显然不会更优,如果没有被填入而放了另一组方案利润更大,则把属于a[i]的位置换成a[i]一定更优,两者矛盾#include<bits/stdc++.h>usingnamespacestd;#def......
  • P1955 [NOI2015] 程序自动分析(并查集)
    相等放并查集里,不等直接判断#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefv......
  • 数据结构:速通并查集
    并查集用来干什么:处理不相交的集合的合并以及查询相交集合的个数等情况例题(自行搜索):36024年第一批笔试算法题传染病防控 并查集具有三个操作initfindunioninit初始化集合,将当前所有节点的父节点设置为自己intfa[]=newint[10000];intsize[]=newint[10000];//这里是......
  • LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,24
    947.移除最多的同行或同列石头题目描述947.移除最多的同行或同列石头n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n 的数组 stones ,其......
  • 基础带权并查集
    只能基础查询到根节点的距离structDSU{intfa[N],siz[N],deep[N];voidinit(){for(inti=1;i<=n;i++){fa[i]=i;siz[i]=1;deep[i]=0;}}intfind(intx){inttmpfa=fa[x];......