我有一个循环有向图。从叶子开始,我希望将附加到每个节点下游的数据传播到可从该节点到达的所有节点。特别是,我需要在周期稳定的任何周期内继续推送数据。
我完全相信这是一个股票图遍历问题。但是,我在寻找合适的算法时遇到了一些困难 - 我想我缺少一些关键的搜索关键字。
在我尝试编写自己的半O(n ^ 3)算法之前,有人能指出我一个合适的解决方案吗? 是这个特殊的问题叫什么?
答案 0 :(得分:24)
由于图形是循环的(即可以包含循环),我首先会将其分解为强连通分量。有向图的strongly connected component是子图,其中每个节点可从同一子图中的每个其他节点到达。这将产生一组子图。请注意,多个节点的强连接组件实际上是一个循环。
现在,在每个组件中,一个节点中的任何信息最终都会在图的每个其他节点中结束(因为它们都可以访问)。因此,对于每个子图,我们可以简单地从其中的所有节点获取所有数据,并使每个节点具有相同的数据集。无需继续经历周期。此外,在此步骤结束时,同一组件中的所有节点都包含完全相同的数据。
下一步是将每个强连接组件折叠为单个节点。由于同一组件中的节点都具有相同的数据,因此基本相同,因此该操作并未真正更改图形。新创建的“超级节点”将继承从组件外部的节点出来或进入组件节点的所有边缘。
由于我们已经折叠了所有强连接组件,因此结果图中将没有循环(为什么?因为如果生成的节点形成了一个循环,它们将首先放在同一个组件中)。结果图现在是Directed Acyclic Graph。没有周期,并且从indegree = 0的所有节点(即没有传入边缘的节点)首先遍历一个简单的深度,将数据从每个节点传播到其相邻节点(即其“子节点”),应该完成工作