我正在分析其依赖项的一些代码。假设存在一些交织的依赖关系,如下所示:
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首选,但对建议开放)可以实现这种减少?
循环中的任何节点都合并为一个节点。指向新节点中任何节点的任何节点都应指向新节点。新节点中任何节点指向的任何节点都应该使新节点指向该节点。
谢谢!
答案 0 :(得分:3)
我相信您要求合并图表的strongly connected components。是
我不记得算法,会尝试查找。
编辑:我们学到的是Tarjan的。我不太清楚地教导它,但是here is the Wikipedia page。
我会尝试提出基本想法。为每个节点提供索引#。然后给每个节点一个lowlink#。 lowlink是我们的根节点的索引:要考虑的第一个可以找到我们路径的节点。如果我们的lowlink ==我们的索引,那么我们就是一个强连接组件的根。否则,我们与lowlink在同一个组件中。通过对整个图形执行此操作,我们可以确定哪些节点是哪些节点是强连接组件的。