邻接矩阵中的传递关系

时间:2012-12-05 04:52:43

标签: c algorithm computation-theory adjacency-matrix

我正在尝试识别两个元素之间的传递关系。我正在用c编码。

例如:a-> b在第1行第2列的邻接矩阵中用“1”表示。

所以如果a-> b和b-> c和c-> d

我想确定是否a-> d。无需更新邻接矩阵。

我采用的方法:检查对应于a的行中的所有1。假设第二列中有1,即b。 [(a-> b)],现在检查是否b-> d如果不继续检查B行中的所有1并继续直到第26行。

我并不真正关心复杂性。我只是希望实现这一点。

1 个答案:

答案 0 :(得分:3)

您需要实施breadth-first searchdepth-first search。从a开始,到达d时停止,或者当您耗尽所有选项时停止。

在您的情况下,深度优先搜索更容易实现,因为“普通”C缺少广度优先搜索所需的内置动态队列。

如果您不关心效率并且不介意更新矩阵,请实施Floyd-Warshall algorithm:它是专门为邻接矩阵制定的,并且只需要五行来实现:

for (int k = 0 ; k != N ; k++)
    for (int i = 0 ; i != N ; i++)
        for (int j = 0 ; j != N ; j++)
            if (matrix[i][k] && matrix[k][j])
                matrix[i][j] = 1;

运行此算法后,结果matrix包含原始算法的传递闭包。