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]]

 

 

 

 

 

posted @ 2025-04-23 18:26  CRt0729  阅读(10)  评论(0)    收藏  举报