关于用 DFS 序作为root的下标与节点作为root下标的问题
查看原帖
关于用 DFS 序作为root的下标与节点作为root下标的问题
105230
Doubeecat楼主2022/7/15 16:04

今早在写这题的时候,我的 DFS 函数是这样实现的:

void dfs(int x,int fa) {
    f[0][x] = fa;
    dep[x] = dep[fa] + 1;
    dfn[x] = ++cnt;rk[cnt] = x;
    root[dfn[x]] = insert(root[dfn[fa]],1,m,a[x]);
    for (auto y : G[x]) {
        if (y != fa) {
            dfs(y,x);
        }
    }
    for (int i = 1;i <= 20;++i) {
        f[i][x] = f[i-1][f[i-1][x]];
    }
}

在此处我将 dfn 作为 root 的下标进行建树,只有测试点 #3 通过了,下午我尝试这样实现:

void dfs(int x,int fa) {
    f[0][x] = fa;
    dep[x] = dep[fa] + 1;
    dfn[x] = ++cnt;rk[cnt] = x;
    root[x] = insert(root[fa],1,m,a[x]);//更改的地方
    for (int i = 1;i <= 20;++i) {
        f[i][x] = f[i-1][f[i-1][x]];
    }
    for (auto y : G[x]) {
        if (y != fa) {
            dfs(y,x);
        }
    }
}

也就是将点直接作为 root 的下标,这样却通过了本题。不太能理解为什么会发生这样的情况,理论上来说这两种方式不应该等价吗?

2022/7/15 16:04
加载中...