从每个节点中找到最高可达节点

Posted

技术标签:

【中文标题】从每个节点中找到最高可达节点【英文标题】:Find the highest reachable node from each node 【发布时间】:2020-03-08 06:59:28 【问题描述】:

我有一个有向图 G(V,E)。 G 可能包含循环。每个 v 都以值 n[v] 开头。让我们调用 Sv G 中 v 可达的所有顶点。对于每个 v,我需要用 max(n[u]) 更新 n[v],u∈Sv。

我尝试过使用带有路径压缩的 Quick-Union,但我不能,因为 G 是有向图。

一个选项是在每个节点上使用 DFS,但在最坏的情况下复杂度将是 O(V(V+E))。

有没有更好的方法来处理它(可能使用拓扑排序、传递约简或强连接组件)?

【问题讨论】:

您需要单独进行一轮更新,还是更新所有内容直到值静止? 静止。每个 n[v] 都需要有尽可能高的值 【参考方案1】:

是的,有更好的方法 O(V+E):

    查找所有强连接组件(Kadane 或 Tarjan 算法)并为组件中的每个顶点保存 max_n[v] 使用强连接组件构建新图 新图是一个 DAG 使用 DP 计算每个组件所需的值(对于 DAG,它可以使用 DFS 自上而下或使用 Kahn 自下而上)

【讨论】:

以上是关于从每个节点中找到最高可达节点的主要内容,如果未能解决你的问题,请参考以下文章

垃圾回收机制

C ++在无序树中查找具有最高值的节点

可达性统计

Tarjan 算法

在图中找到最长的路径,其中每个节点最多有两条传入边和两条传出边

可达性分析算法(根搜索算法GCRoots)