我有一个n-partite(无向)图,作为邻接矩阵给出,例如这个:
a b c d a 0 1 1 0 b 0 0 0 1 c 0 0 0 1 d 0 0 0 0
我想知道是否有一组矩阵运算可以应用于此矩阵,这将产生一个矩阵,该矩阵“列出”此图中所有路径(长度为n,即通过所有分区) 。对于以上示例,存在路径a-> b-> d和a-> c-> d。因此,我想得到以下矩阵:
a b c d 1 1 0 1 1 0 1 1
第一个路径包含节点a,b,d,第二个路径包含节点a,c,d。如有必要,结果矩阵可能有一些全0行,如下所示:
a b c d 1 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0
谢谢!
P.S。我已经研究了用于计算传递闭包的算法,但这些算法通常只能说明两个节点之间是否存在路径,而不是直接指向该路径上的哪些节点。
答案 0 :(得分:4)
你可以做的一件事是计算矩阵A的n次方。结果将告诉你从任何一个顶点到任何其他顶点的长度为n的路径数。
现在,如果你有兴趣了解路径上的所有顶点,我认为使用纯矩阵运算是不可取的。请记住,您有一个n-partite图表,我将建立一个如下数据结构:(请记住,除了小值之外,所有空间成本都是昂贵的。)
每列中的每个节点都有一个条目。如果此节点在我们指定的起始顶点或起始集合的第n次迭代中可到达,则第n列将包含1 in,否则为0。每个列条目还将包含一个指向n-1列中顶点的后向指针列表,这些顶点指向第n列中的此顶点。 (这就像维特比算法一样,除了我们必须为每个条目维护一个后向列表而不仅仅是一个。)这样做的复杂性是(m ^ 2)* n,其中m是顶点的数量。图表,n是所需路径的长度。
我对你的顶部矩阵感到有点困惑:使用未校正的图形,我希望邻接矩阵是对称的。
答案 1 :(得分:2)
不,没有纯矩阵方式来生成所有路径。请使用纯组合算法。
'你能做的一件事就是计算矩阵A的n次方。结果将告诉你从任何一个顶点到任何一个顶点的长度为n的路径数。'
matriax的力量产生的不是路径。