有向图:检查邻接矩阵中的循环

时间:2015-12-24 11:16:32

标签: algorithm matrix graph

有一种关于DFS算法的替代方法,用于检查用邻接矩阵表示的有向图中是否存在周期?

我发现了关于矩阵属性的零碎信息。 也许我可以将矩阵A自身乘以n次,并检查每个结果矩阵中是否存在非零对角线。

虽然这种方法可能是正确的,但我如何明确提取表示循环的顶点列表? 那个假设算法的复杂性怎么样?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

假设在n次迭代后,您有一个矩阵,其中第i行和第j列的单元格为M[n][i][j]

根据定义M[n][i][j] = sum over k (M[n - 1][i][k] * A[k][j])。让我们说M[13][5][5] > 0,意味着它的长度为13,从5开始到5结束。要拥有M[13][5][5] > 0,必须有kM[12][5][k] * A[k][5] > 0。让我们说k = 6,现在您知道循环中的另一个节点(6)。它也遵循M[12][5][6] > 0A[6][5] > 0

要拥有M[12][5][6] > 0,必须有kM[11][5][k] * A[k][6] > 0。让我们说k = 9,现在,您知道循环中的另一个节点(9)。它也遵循M[11][5][9] > 0A[9][6] > 0

然后,您可以重复执行相同操作以查找循环中的其他节点。

答案 1 :(得分:0)

可以修改深度优先搜索以确定是否存在循环。该算法第一次发现先前已访问过的节点时,可以从堆栈中提取循环,因为先前找到的节点仍必须在堆栈上;使用用户定义的堆栈而不是调用堆栈是有意义的。复杂度为O(|V|+|E|),与未修改的深度优先搜索本身一样。