我在C中使用Prim MST,该函数采用邻接矩阵。考虑到A[i][j]
中的权重。
假设我有一个前驱数组,它追踪到目前为止我找到的最小边。
predecessor[u]=v
{这也是最终的MST}
现在我想修改当前的A[i][j]
矩阵并将权重更改为1。
也就是说,前端数组中也存在边(索引)。
否则我将其更改为零。
我该怎么办?这是我的解决方案:
for (x....)
for (y...)
if (x!=y && (p[x]==y || p[y]==x))
set to 1
else
set to 0
答案 0 :(得分:2)
您的伪代码是正确的,这将为您提供一个0-1矩阵,表示Prim算法找到的树。但是,这种存储方法相当昂贵,因为它需要O(n ^ 2)空间,而树可以存储在O(n)存储器中。
或者,您可以将矩阵初始化为O(n ^ 2)中的零,然后在O(n)时间内添加边:
for (x ...)
for (y ...)
A[x][y] = 0
for (x ...)
if (p[x] != x)
A[x][p[x]] = A[p[x]][x] = 1