我正在学习从邻接矩阵(比如AM1)计算路径矩阵的方法。
具有n个顶点的图G的路径矩阵是布尔n * n矩阵,其元素可以定义为:
p[i][j]=1(if there is a path from i to j)
p[i][j]=0(otherwise)
我学到的步骤如下:
如果我们将邻接矩阵A [] []自身相乘,我们得到A ^ 2(比如AM2),其每个顶点A [i] [j]基本上表示从i到j的路径长度2的路径数。
类似地,如果我们将邻接矩阵乘以3次,即我们得到A ^ 3(比如AM3),其每个顶点A [i] [j]基本上表示从i到j的路径长度3的路径数。等等。
现在我们定义一个Matrix X,以便:
X = AM1 + AM2 + AM3 ... AMn(其中n是顶点数)
从这个X矩阵中,我们通过将所有非零顶点替换为1来计算路径/到达能力矩阵。
我无法理解的是如何将所有非零顶点替换为1给出了路径矩阵。 为什么我们计算或添加所有矩阵到AMn。?。
据我所知,X [i] [j]表示路径长度n或小于n的路径数,从i到j,但为什么我们只计算直到n,而不是更多或更少?
请解释一下!
答案 0 :(得分:3)
我无法掌握的是如何将所有非零顶点替换为1给出了路径矩阵?
如果A^k
在i->j
步之后从k
给出了路径数,则非零数字表示路径矩阵中的相应条目应为True,因为至少存在一条路径。现在,k=1
(循环),k=2
,k=3
......一直到k=N
...
但为什么我们只计算到n,而不是更多或更少?
如果在只有N个顶点的图上有i->j
的路径,最坏的情况是有一个路径占用每个中间顶点,即N-1步,因此需要计算A^N
。
请注意,还有其他更便宜的方法来计算所谓的路径矩阵。基本上(对于无向图),您正在寻找图的connected components,这可以通过深度优先搜索在线性时间内完成。要计算所有A^k
,每次乘法需要大约O(N^3)
次,N
次,总共大约O(N^4)
。这可以通过矩阵的对角化O(N^3)
来避免,其特征值和特征向量可以对图的结构有所了解(远远超过路径矩阵本身!)。