社区讨论

trie 树怎么并查集合并

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lz9ne9rl
此快照首次捕获于
2024/07/31 17:32
2 年前
此快照最后确认于
2024/07/31 19:22
2 年前
查看原帖
各位佬,我正在尝试用并查集合并 trie 树上的点,但是有个地方不理解,为什么最后要写 y = find(y),修改子树对 y 有什么影响吗
C
void merge(int x, int y)
{
    if (x == y) return; //已经在同一集合就跳过
    fa[x] = y; //将 x 合并到 y 
    st[y] |= st[x]; //访问不到之后把之前的答案挂到 y 上
    //合并 x, y 的子树
    for (int i = 0; i <= 9; i++)
    {
        int a = son[x][i], b = son[y][i];
        int pa = find(a), pb = find(b);
        //由于我们将 x 合并到 y,所以如果 y 下面没有了,要加过去
        if (!b) son[y][i] = pa;
        else if (a) merge(pa, pb), y = find(y); 
    }
}

回复

0 条回复,欢迎继续交流。

正在加载回复...