给定一个定向图,我需要一种方法来检测图中的周期,以及查找一个顶点是否处于一个周期中,或者只是一个周期中一个顶点的边缘。
以下是一个例子:
A -> B
B -> A
C -> A
A -> B
和B -> A
在这种情况下形成一个循环,并且应该以一种方式着色,但顶点C
不是循环的一部分,它只是一个进入循环边缘,所以它应该以不同的方式着色。
我可以轻松地检测自己的周期,只需从随机顶点开始,着色它,然后进行DFS。如果我用相同的颜色点击一个顶点,我知道我处于一个循环中并将递归地传播错误。问题是它不允许我查看我从递归调用中获得的错误是因为我目前处于一个循环中,还是因为我只是指向先前检测到的错误。
图表基本上代表了延迟评估的单元格的依赖关系,我试图查看单元格是否因为传递性地引用自身而未能评估,或者因为它依赖于某个循环中的其他单元格(这两个应该是不同的错误。)
我现在实现它的方式,我只是强制评估当前单元格的所有依赖关系,并根据该评估的结果分配值。但如前所述,这种递归不允许我区分这两种情况。
答案 0 :(得分:1)
用于搜索有向图http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm的强连通分量的Tarjan算法允许您进行所需的区分。