P3820 小D的地下温泉
这道题的考点比较多. 前置芝士 1. BFS ( DFS ),这两种算法在这道题中并没有什么特别突出的地方,基本就是自己看心情写(本文以DFS为准, 所以我心情是好是坏呢? ) 2. 连通块 ,可以将每一个温泉看作一个连通块,这样就变成了一个图上问题. 3. 并查集 ,在判断图中元素是否相连时需要用到(具体下文会讲到). 具体做法 先用搜索将每个温泉(连通块),处理出来,并且统计出每个连通块的大小.在每次查询时只需要查询当前连通块的大小,取出最大的连通块并输出编号即可.那么,问题就在修改操作了. 当修改的点是水时只需要将当前连通块的数量-1,并且将这个位置改为土地就好了,但是当这个位置是土地时可能会将两块本不是相连的连通块连在一起,数据还是很大的,如果暴力修改肯定是会T的,这时,并查集派上用场了.当两个块因为这个点变成了温泉而相连时可以将其中一个连通块的father指向另一个连通块的father,将sum也相加这个问题就解决了,当这个位置并,没有将不同连通块连在一起时需要再开一个连通块. 细节 1.N,M很大,不能用二维数据储存,但是NM并不大,所以对于(x,y)可以将它储存在map[(x-1)*M+y]中,但是这样储存时对于边界一定要特别判断,不然很容易就会出错. 2.并查集初始化时father[i]=i建议i从1到N*M赋值,或者在开出一个新的连通块时赋值. 3