📌  相关文章
📜  距目标 K 距离内的节点总和(1)

📅  最后修改于: 2023-12-03 15:28:14.422000             🧑  作者: Mango

距目标 K 距离内的节点总和

介绍

在树形数据结构中,有时需要找到距离一个目标节点K一定距离范围内的所有节点,并计算它们的值的总和。这种情况常常出现在树形DP算法中,如树形背包问题。

本文将为程序员介绍如何实现“距目标K距离内的节点总和”算法,并提供代码实现。

算法思路

我们可以使用DFS(深度优先搜索)来遍历整棵树,并记录每个节点到目标节点K的距离。同时,我们还需要记录每个节点的值。假设我们要找到距离目标节点K的距离在[L,R]之间的节点值的总和,可以用下面的公式计算:

ans = sum[i] (L <= d[i][K] <= R)

其中,d[i][K]表示节点i到目标节点K的距离,sum[i]表示节点i的值。

代码实现

下面是使用C++实现“距目标K距离内的节点总和”算法的代码片段:

vector<int> tree[maxn];
int sum[maxn], d[maxn][maxn];

void dfs(int u, int fa, int K) {
    d[u][K] = d[fa][K] + 1;
    for (int v : tree[u]) {
        if (v != fa) dfs(v, u, K);
    }
}

void solve(int u, int fa, int L, int R) {
    for (int v : tree[u]) {
        if (v != fa) {
            dfs(v, u, v);
            solve(v, u, L, R);
            for (int i = 1; i <= n; i++) {
                if (L <= d[v][i] && d[v][i] <= R) ans += sum[i];
            }
        }
    }
    if (L <= d[u][1] && d[u][1] <= R) ans += sum[u];
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> sum[i];
    }
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }
    int q;
    cin >> q;
    while (q--) {
        int K, L, R;
        cin >> K >> L >> R;
        ans = 0;
        dfs(K, 0, K);
        solve(K, 0, L, R);
        cout << ans << endl;
    }
    return 0;
}

其中,tree[maxn]表示树的邻接表,sum[maxn]表示每个节点的值,d[maxn][maxn]表示每个节点到目标节点的距离。在dfs函数中,我们计算每个节点到目标节点的距离,然后在solve函数中用另一个DFS遍历整棵树,计算距离[L,R]范围内的节点值的总和。最后,根据输入的查询条件(K,L和R),输出总和。

总结

本文介绍了如何使用DFS实现“距目标K距离内的节点总和”算法,并给出了C++代码实现。当在树形数据结构中遇到类似问题时,可以借鉴本文的算法思路。