有没有一种有效的算法来检测有向图中的循环?
我有一个有向图,表示需要执行的作业计划,作业是一个节点,依赖项是一个边。我需要检测这个图中导致循环依赖关系的循环的错误情况。
有没有一种有效的算法来检测有向图中的循环?
我有一个有向图,表示需要执行的作业计划,作业是一个节点,依赖项是一个边。我需要检测这个图中导致循环依赖关系的循环的错误情况。
当前回答
如果一个图满足这个性质
|e| > |v| - 1
那么图至少包含一个周期。
其他回答
我已经在sml(命令式编程)中实现了这个问题。这是大纲。找到所有入度或出度为0的节点。这样的节点不能成为循环的一部分(因此将它们删除)。接下来,从这些节点中删除所有传入或传出边。 递归地将此过程应用于结果图。如果最后你没有剩下任何节点或边,图就没有任何循环,否则就有。
从DFS开始:当且仅当DFS期间发现后边缘时,循环存在。这是白径定理的结果。
如果一个图满足这个性质
|e| > |v| - 1
那么图至少包含一个周期。
正如你所说,你有一组作业,它需要按一定的顺序执行。给定作业调度所需顺序的拓扑排序(如果是直接的非循环图,则用于解决依赖问题)。运行dfs并维护一个列表,并在列表的开头开始添加node,如果您遇到一个已经被访问过的节点。然后在给定的图中找到一个循环。
最简单的方法是对图进行深度优先遍历(DFT)。
如果图有n个顶点,这是一个O(n)时间复杂度算法。因为你可能必须从每个顶点开始进行DFT,所以总复杂度变成O(n^2)。
您必须维护一个包含当前深度第一次遍历的所有顶点的堆栈,其第一个元素是根节点。如果在DFT期间遇到一个元素已经在堆栈中,那么就有一个循环。