【问题标题】:Traversal of cyclic directed graph循环有向图的遍历
【发布时间】:2010-08-30 18:48:33
【问题描述】:

我有一个循环有向图。从叶子开始,我希望将附加到下游每个节点的数据传播到从该节点可到达的所有节点。特别是,我需要在达到的任何周期中不断推送数据,直到周期稳定。

我完全确定这是一个股票图遍历问题。但是,我在尝试找到合适的算法时遇到了相当大的困难 --- 我想我错过了一些关键的搜索关键字。

在我尝试编写自己的半途而废的 O(n^3) 算法之前,谁能指出一个合适的解决方案?而这个特殊的问题是什么?

【问题讨论】:

  • 这可能是某种全对全广播(或全对全分散)通信问题。如果您使用这些关键字进行搜索,可能会有所帮助。
  • 也许这些事情其他人都清楚,但是从叶子开始向下游传播数据是什么意思?叶子不是下游没有节点的节点吗?另外,周期稳定是什么意思?
  • 我认为我所说的“叶子”可能会更清楚地描述为“根”,尽管考虑到它是一个循环图,所以这个术语特别直观——我的意思是一个没有父节点的节点.下游是孩子们的方向。因为循环的遍历可能会揭示更多可能需要传播到已经访问过的节点的信息,所以一些节点可能需要多次访问,这意味着决定何时终止可能会很棘手;因此稳定。事实上,事实证明有一种更简单的方法可以做到这一点——见答案。

标签: algorithm graph directed-graph


【解决方案1】:

由于图是循环的(即可以包含循环),我首先将其分解为强连接的组件。有向图的strongly connected component 是一个子图,其中每个节点都可以从同一子图中的每个其他节点到达。这将产生一组子图。请注意,多个节点的强连通分量实际上是一个循环。

现在,在每个组件中,一个节点中的任何信息最终都会出现在图的每个其他节点中(因为它们都是可访问的)。因此,对于每个子图,我们可以简单地从其中的所有节点中获取所有数据,并使每个节点都具有相同的数据集。无需继续循环。此外,在这一步结束时,同一组件中的所有节点都包含完全相同的数据。

下一步是将每个强连接组件折叠成一个节点。由于同一组件内的节点都具有相同的数据,因此基本相同,因此该操作并没有真正改变图形。新创建的“超级节点”会继承所有从组件外节点出入组件节点的边。

由于我们已经折叠了所有强连接的组件,因此结果图中将没有环(为什么?因为如果结果节点形成了一个环,那么它们首先会被放置在同一个组件中)。结果图现在是Directed Acyclic Graph。没有循环,并且从 indegree=0 的所有节点(即没有传入边的节点)进行简单的深度优先遍历,将数据从每个节点传播到其相邻节点(即其“子节点”),应该可以完成工作.

【讨论】:

  • 完美。这也使我一直在研究的其他几个问题变得更加容易处理。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多