并查集 小结

并查集在许多题目里其实只是用来辅助的一个小数据结构,用来实现简单的查找和合并。本文只挑选了

以并查集为中心、以并查集的灵活运用为根本的题目——

经典的&&特殊的技巧

[BZOJ4195][Noi2015]程序自动分析
Noi中竟然出了基础的并查集题目!这道题确实只是并查集的简单操作,只不过需要离散化+排序而已。
[NOIP2010]关押罪犯
并查集里经常会有一类问题:敌人的敌人还是朋友。
其实这道题本质上就是这样的,实际上这就是说只有两个集合,每一个点至少属于一个集合。这种问题通常有两种处理方法:一个是,类似于建图,将某个点所有的敌人都两两合并起来;另外一个就是这道题的处理方法,记录一下每个人第一次是和哪个不在一个集合里,然后再进行合并。
[NOI2000]食物链
可以说是虚点+并查集?因为实际上这道题是将一个点拆成三个,表示不同的含义。
[BZOJbegin][NOIP十连测热身赛]星球联盟
利用并查集缩点的思路。每一个点只会被合并一次,所以时间复杂度是 O(n) 的。
[BZOJ3694]最短路
这道题也可以说是并查集缩点叭。。不过有一点不同的是因为是从小到大排序的,所以一个点被一个更新过了就不会被下一个更新,所以每一次维护链顶即可。
[BZOJ1015][JSOI2008]星球大战starwar
并查集的一个非常巧妙但是非常常用的套路,就是拆不好拆,改成反向加。
[BZOJ1202][HNOI2005]狡猾的商人
加权并查集。什么是加权并查集呢?其实就是在合并的过程中维护一些信息。这道题是维护的每一个点与其代表元素之间的信息。
[noi2002]银河英雄传说
非常经典的另一道加权并查集。本题维护了两个量,在合并和查找的时候都要更新。
[BZOJ4569][Scoi2016]萌萌哒
相同长度的区间用并查集实现相应合并。f[j][i]的含义是:从i开始的2^j的长度区间和从f[j][i]开始的2^j的长度区间是可以合并的。每次并查集合并f[j][x],f[j][y]的时候,要把f[j-1][x],f[j-1][y]以及 f[j-1][x+(1<<(j-1))],f[j-1][y+(1<<(j-1)] 合并,这样自顶向下的合并过程中,如果之前已经合并过了就直接退出。

你可能感兴趣的:(并查集,学习笔记)