这周开始开练习并查集跟拓扑拓排序,关于这部分内容,看了几篇博客,基础知识不算多,老师上课也主要都是讲解题目,很多题目可能要跟前面学的最小生成树还有要学的新知识结合起来用。
并查集的应用
1.用来合并集合元素,并确定结合数量,查寻元素属于哪个集合。
2.在图结构里(图里的点便是元素),确定两点是否处于联通状态,应用举例:
(1)Kruskal法最小生成树
思路:将所有的边依照长度大小排序,依次从小到大进行行选泽,每次选中一边,就将边两端的点用并查集合并,如果选择的边经并查集查询已经联通,那么跳过这条边。
例:p1111 修复公路
这是练习的第一道题,看题意是比较适合用并查集的,可以这样想:
在路全都被地震破坏后,每一个村庄都是一个集合,一旦连通了一条,那么两个村庄便重新组成一个集合,这时集合数减一,直到集合数为一(即所有村庄都连起来了)输出此时的时间。因为刚开始每个点都是独立的,有n个点,所以就有n个联通块,每连上一条边,联通块就会減少一个,最终当联通块的数量为1的时候,整个图就是联通的。然后又因为题目要求求最小的全图联通时间,所以直接sort一遍,顺序判断就可以,所以在连接两个村庄之前我们先要通过时间对它们排序。
如果用Kruskal法最小生成树,题目中要求如何在最短时间内使图中任意两个点都能互相到达,因为所有道路可以同时开始修复,所以题目就是让我们求最小生成树中最长的那条边。
p1195 口袋的天空
这道题感觉跟上面那道差不多,是用了并查集和最小生成树。题意就是n个顶点构造k个树,则需要连n - k条边。一开始图中的每个点都是一棵树,先查询两个点是否在同一个树中,如果不在,则将两个数合并成一个树,只需要用一个变量cur存储当前图中有几个树,每次合并树的时候cur减1,当cur的值等于k的时候,合并树所需要的花费也就是最后的答案。
p1396 营救
这道题读题的时候就对这道题很感兴趣,题目描述跟背景可以说是很幽默了,出题人很皮。但题意其实就是规划一条从s到t的路线,使得经过边的权值的最大值最小。想到了好几种方法,用并查集可能是最简单的,思路就是把每条边从小到大排一边序,每一次取出一条边,如果这条边的加入能让s到t是连通的,那么这个值就是所要求的值;如果此时还不连通,就继续找下一条边。这样从小到大找就能保证找到一个路径经过边的权值最大值最小。
p1455 搭配购买
这道题是思考了一会确定不会做之后直接去看的题解,看大佬说这是一道并查集+01背包的问题,于是迅速去看了点01背包的知识内容,前面其实就是利用并查集,将这m组配对购买的商品划到一个集合里,这样就可以确定买了其中一个就得买另一个。后面就是01背包问题了,好在这块知识并不是很难。感觉看完题解之后,瞬间感觉这道题不难,
p1536 村村通
做完前面那几道题,再看这道题,可能会觉得这道题稍微简单那么一点?感觉跟之前做过的那道例题差不多,所以基本思路还是很好想,就是询问区间块的个数,这道题不多说了。
到现在已经做了很多并查集的题目了,这部分还是多做题吧,后面的题目可能会难一些,争取下周能把那些题做完。并查集的用处还是很多的,一些很难的的题其实都可以用并查集来做,瞬间简洁了很多,争取把这部分内容继续学好学懂,下周继续做这部分专题。