查找长度= 4的路径,从有向图的邻接矩阵开始,仅考虑不同的边?

时间:2019-02-06 17:32:17

标签: graph parallel-processing

鉴于EREW-PRAM模型,该模型允许我并行使用任意数量的处理器,而不会发生冲突,在读取,在写访问中都没有冲突,因此我需要找到长度为4的路径数输入节点-节点邻接矩阵A,表示有向图,我需要排除不使用不同边的路径(例如:(a,b),(b,a),(a,b),(b, a)不是有效路径)。

我有一个使用n ^ 3个处理器并在O(logn)时间计算两个给定矩阵的矩阵乘法的函数:

mult-matrix(A, A, n) => B->为我提供了长度为2的路径。

mult-matrix(B, B, n) => C->为我提供了长度为4的路径,但我认为它考虑的是跨越相同边缘的路径。

我尝试从C的元素中减去1,其中C的节点u与节点v双向通信,但是我不确定它是否有效。

考虑到我只需要从结果矩阵C中排除一些路径,我该如何解决这个问题?

考虑到处理器的数量限制为n ^ 3,并且在最坏的情况下,时间必须为O(logn),因此任何工作解决方案都应得到赞赏。必须使用伪Pascal语言解决这些练习,但是给出可行的解决方案,我应该可以自己编写伪代码。

1 个答案:

答案 0 :(得分:1)

我想我在https://www.perlmonks.org/?node_id=522270找到了解决方案

使用输入矩阵A,我可以使用提供的函数来计算长度为2、3和4的路径的邻接矩阵。

  • A2是通过将A * A乘以得到的邻接矩阵,并且包含长度为2的路径
  • A3通过乘以A2 * A获得,并且包含长度为3的路径
  • A4通过乘以A3 * A获得,并且包含长度为4的路径

为了排除重复的边缘,我必须计算矩阵C,该矩阵是通过对计算出的矩阵进行逐元素减法获得的。

C[i,j] = A4[i,j] - A3[i,j] - A2[i,j] - A[i,j]

C包含最终结果。

以下伪代码解决了使用O(n ^ 3)处理器并及时使用O(logn)的EREW-PRAM的问题。

procedure paths_length_4(A, n) // Work = O(n^3 logn)
begin
    A2 := mult_matrix(A, A, n) // T=O(logn), P=O(n^3)
    A3 := mult_matrix(A2, A, n) // T=O(logn), P=O(n^3)
    A4 := mult_matrix(A3, A, n) // T=O(logn), P=O(n^3)
    for all i,j where 1 ≤ i ≤ n, 1 ≤ j ≤ n pardo // P=O(n^2)
        C[i,j] := A4[i,j] - A3[i,j] - A2[i,j] - A[i,j]
end