计算有向图中的循环次数

时间:2013-11-13 17:33:53

标签: algorithm graph-algorithm

我遇到了一个计算有向图中循环次数的有趣问题。

为了检测图中的循环,我们可以使用DFS,但是为了检测循环次数,DFS不会有多大用处,因为有些边缘在某些循环中会很常见。

我正在试图弄清楚生成树在这里是否有任何帮助。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是一种派生结构以帮助解决循环计数问题的算法:

  • 对于每个节点,派生indegree(传入边数)和outdegree。
  • 删除所有具有indegree零的节点。那些不是循环的一部分。从他们的继承者中,从indegree中减去1。从他们的前辈中,从outdegree中减去1。
  • 删除所有超过0的节点,因为它们也不能成为循环的一部分。像之前一样,相应地从相邻节点中减去indegrees和outdegree。
  • 重复前两个步骤,直到没有更多节点具有indegree或outdegree为零。现在所有剩余的节点都是循环的一部分。
  • 具有indegree = 1或outdegree = 1的所有节点可以分别与其前任或后继节点组合。节点可以组合在一个列表中,因为它们将处于完全相同的循环中。

剩下的图只有indegree和outdegree都大于或等于2的节点。它包含对原始图的节点的引用。

  • 现在在剩余的图表中找到强关联的组件。
    • 找到只能以单一可能方式遍历的循环的奇异节点,即单个循环。
    • 具有多个(至少3个)组合节点的子图表示更复杂的循环结构。可以根据循环计数的适当定义来计算循环。计数可以通过回溯来完成。