并查集应用一般有如下三个题型:
1.合并查询等常规操作,常见有判断无向图中是否产生环,有多少个联通的块等。
2.带权并查集,在初始化、合并集合时,额外维护每个集合所包括的节点数;或额外维护集合中每个节点到根节点的距离,即用并查集来维护额外信息。
3.并查集的删边问题,通常用逆序建立集合进行处理,离线+逆处理。
给出一些连通的块,要想让所有块都连通,至少还要连通几次。
属于第一种题型,根据当前节点是否等于它的根节点,判断目前有多少个独立的集合
思路:先用并查集记录下来目前已经连通的节点,然后遍历所有节点,判断根节点是否都相同,若不同,则合并,ans++。(另一种思路是遍历所有节点,记录目前一共有几个独立的集合,则ans=集合数-1)
与上题相同,优化了一下判断有多少个独立集合的思维。
属于第一种题型的应用,判断有多少个独立的集合。
类似判断森林里有多少棵树,即判断有多少个独立的集合,设节点数为n,遍历每个节点,若某点的根节点是自己,则说明有一个独立的集合,ans++即可。只是判断有多少个独立集合,而不进行其他操作的话,用这种方法更快更简单。
给出矩阵中坏的电脑的坐标,只有两台距离小于d的电脑才能互相通信,进行n次操作,修复某台电脑或询问两台电脑是否能够通信。
属于第一种题型,判断祖宗节点是否相同。
思路:存储电脑坐标,若电脑间距离小于d,则用邻接矩阵存储两台电脑的无向边表示连通。电脑是否修复设置标记数组,只有电脑所在位置被修复且两台电脑之间的距离小于d,才进行合并。根据祖宗节点是否相同,即是否在同一个集合,即可判断能否进行通信。
一块领土中有很多塔,可由围墙连接起来,输入数据表示AB塔之间有围墙连接,问塔把领土分成了多少块。
属于第一种题型的应用。根据祖宗节点是否相同判断集合中有多少环。
思路:输入连通节点时进行合并,若两点的祖宗节点不同则进行合并,否则环数(ans++)。判断并查集中是否成环,即遍历节点判断他们的根节点是否相同,不相同则进行合并,此时如果有环,则会出现将要合并的两点的根节点相同的情况,即出现了环,环数++。
一个可疑的患者可同时在多个组,所在的组的所有同学都被认为是可疑的患者,求一共的可疑的患者数量。
属于第二种题型,在初始化、合并集合的同时记录每个集合的节点数
思路:初始化节点,根据输入进行集合的合并,同时进行两个集合节点数的相加,最后输出可疑患者所在的集合的总节点数即可。
核心代码:初始化时每个节点的size都为1;合并时:
size[find(b)]+=size[find(a)];//a向b合并时,b节点数增加
p[find(a)]=find[b];
abc三种动物构成环形食物链,给出数据表示xy的关系,同类或y被x吃,若后面的描述与之前的描述冲突则为假话,求一共有几句假话。
属于第二种题型,并查集维护额外信息。
思路:给出xy关系,再给出xz的关系,一定就可以推断出xz的关系。因此,记录每个点与根节点的关系(用每个点到根节点的距离来表示),距离为1表示吃根节点,距离为2表示被根节点吃,距离为3表示与根节点同类,三种动物关系循环,用距离%3表示与根节点的关系。op==1时,若xy根节点相同,x、y到根节点%3的值不同则是假话,xy根节点不同则合并(合并时,xy父节点之间的距离应满足x到px-y到py+距离的结果%3等于0,故把xy父节点之间距离设为dy-dx)。op==2时也一样进行判断即可。
n个点n-1条边构成连通图,每条边有边权0或1,求每个点最近的点的个数。
属于第二种题型,维护size的并查集。
思路:最近的点只有自己或边权为0的点,输入时只将边权为0的点合并,合并时将每个集合的大小相加记录size即可。
有n个顶点、m条边的无向图要求依次输出当删除给出的前k条边后,该图的连通分量数
属于第三种题型,删除前K条边,仅需倒叙插入m-k条边即可
思路:按序保存好所有边和连通节点的信息,从第m-1条边开始逆序合并,每次合并若不在一个集合,ans=n,ans--
给出n个星球的连接关系,m个操作,删除ab边或查询与a相连的能量最大的星球,若一样大,输出编号小的。
属于第三种题型,不断删边+询问,故进行离线逆处理。
思路:读入时删除的边不进行合并,初始是需要删的边全部删完的状态,将操作储存下来离线逆处理,删除就变成了添加。合并时根据能量大小进行合并,把大的作为小的根节点,若大小相同则编号小的为根节点。
拓扑排序这周看的资料不够多,还是时间没充分用上,应该反思。已经看过的资料都是比较浅的拓扑排序的应用题,有如下几个应用:
1.根据入度确定拓扑序列,如确定比赛关系等。
2.判断有向图中是否存在环。
3.维护有向图、有序序列的相关信息。
根据输赢情况确定比赛排名,若排名不唯一,则按编号小的在前输出。
根据有向关系确定序列顺序。
思路:输赢情况用有向图来存储,根据节点入度确定排名,故用拓扑排序,编号小的先输出,若1->2,2->3,4->3,则次序为1243,也就是说4与2同级,但由于编号和排名,4必须排在2后面3前面,故用优先队列实现。(因为保证了只有节点入度为0时才入队,所以不会存在不同级的节点同时出现在队列里的情况,即每次在队列里的都是同级的,按编号大小输出即可)
给出n个人的m条关系,表示a是b的老师,但给出的关系中不能有环,即不能出现a是b的老师,b是c的老师,而c又是a的老师。
拓扑排序判断有向图是否产生环。
思路:最初想直接用并查集不断合并来判断环,后来经过验证,如果出现ac bc ab的情况,应该是合法的,但并并查集(无向)会判断为产生了环。故得出结论:并查集并不能维护有向的信息,即并查集适用于判断无向图是否产生环,拓扑排序适用于判断有向图是否产生环。通过判断是否所有点都已经入队来判断是否产生环。
n个人,m条要求说明a比b的奖金要求高,不能有环。输出最小需要的奖金数。
根据有向图的拓扑序列来维护图中每个节点的相关信息。
思路:根据m条要求存图,最初入度为0的节点设最低值,以后每层入队的节点奖金++,求出总和即可。