直接回答:并查集维护元素的分组(连通分量),支持近 O(1) 的“合并两组”与“查是否同组”。两个优化缺一不可:路径压缩(find 时把沿途节点直挂根,摊还接近 O(1),严格说是反阿克曼 α(n))与按秩/大小合并(小树挂大树,防链化退化)。只做一个都能过多数题,两个都做才是教科书复杂度。

展开解析:识别“本质是连通性”的信号:问题只关心“是否连通/几个连通块/动态加边后的连通性”,不关心路径与距离——一旦问最短路径就是 BFS/最短路的地盘。经典应用地图:Kruskal 最小生成树(按边权升序加边,并查集判环);朋友圈/省份数量(连通块计数,初始化 count=n,每次成功合并 count--);岛屿数量(二维网格也可并查集,虽然 DFS 更直给);冗余连接(找成环边——合并时发现已同组即答案);等式满足性(可满足的等式约束——先并所有等号,再查每个不等号两端是否同组,带权并查集可扩展到“倍数关系”类约束)。带权并查集要点:节点到根的边权(距离/倍数)在路径压缩时累加更新,处理“a 是 b 的两倍”类相对关系问题(如除法求值)。工程细节:路径压缩一行递归(parent[x] = find(parent[x]))即可;按大小合并比按秩更直观;离线查询场景(询问与操作全给出后可倒序处理——删边变加边)是竞赛进阶技巧。边界提醒:并查集不支持高效删边(分裂连通块),需要删边的问题上可持久化并查集或转 LCT——面试说到这层就完整了。

追问方向:α(n) 为什么在实际中等价于常数?带权并查集的路径压缩如何维护边权?

(约 490 字)