将循环图减少到树(依赖图 - >树)

时间:2011-03-31 23:52:20

标签: algorithm dependency-management graph-reduction

我正在分析其依赖项的一些代码。假设存在一些交织的依赖关系,如下所示:

                 F
      A         /|
      |        / |
      |       /  |
      V      <   V
      B<--->C--->E
       \   /     |
        > <      |
         D<------+

B取决于A和C. C取决于B和F. E取决于C和F. D取决于B和C以及E

我们遇到了B和C的问题,它们相互依赖。它们应该组合成一个超级节点。 我们有C和E和F的问题,它们有一个循环。它们应该组合成一个超级节点。

你最终会得到

  A
  |
  V
super
 node
  |
  |
  D

是否有一个好的库或算法源(Java首选,但对建议开放)可以实现这种减少?

循环中的任何节点都合并为一个节点。指向新节点中任何节点的任何节点都应指向新节点。新节点中任何节点指向的任何节点都应该使新节点指向该节点。

谢谢!

1 个答案:

答案 0 :(得分:3)

我相信您要求合并图表的strongly connected components。是

我不记得算法,会尝试查找。

编辑:我们学到的是Tarjan的。我不太清楚地教导它,但是here is the Wikipedia page

我会尝试提出基本想法。为每个节点提供索引#。然后给每个节点一个lowlink#。 lowlink是我们的根节点的索引:要考虑的第一个可以找到我们路径的节点。如果我们的lowlink ==我们的索引,那么我们就是一个强连接组件的根。否则,我们与lowlink在同一个组件中。通过对整个图形执行此操作,我们可以确定哪些节点是哪些节点是强连接组件的。