P1196 [NOI2002] 银河英雄传说
关键点解析
1. d[x] 的定义
-
初始时:
d[x] = 0(因为f[x] = x,自己到自己的距离为 0)。 -
合并后:如果
x的父节点是y,则d[x]表示x到y的距离(即x前面有多少战舰)。 -
路径压缩后:
x直接指向根节点,此时d[x]需要更新为x到根节点的总距离。
2. 路径压缩的作用
-
普通并查集:路径压缩只是让
x直接指向根节点,不维护距离信息。 -
带权并查集:路径压缩时,需要将
x到旧父节点的距离d[x],加上旧父节点到根节点的距离d[f[x]],得到x到根节点的总距离。
3. 为什么是 d[x] += d[f[x]]?
-
递归过程:
find(x)会先递归调用find(f[x]),此时f[x]已经直接指向根节点,且d[f[x]]已经更新为f[x]到根节点的距离。 -
距离累加:
x到根节点的总距离 =x到父节点的距离d[x]+ 父节点到根节点的距离d[f[x]]。


浙公网安备 33010602011771号