我正在尝试识别两个元素之间的传递关系。我正在用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行。
我并不真正关心复杂性。我只是希望实现这一点。
答案 0 :(得分:3)
您需要实施breadth-first search或depth-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
包含原始算法的传递闭包。