给出从 u 到 v 的所有路径的MST查找,其中u!= v,遍历图形中每个边的次数。 例如,图中的边AC可以在从A到C或从A到B到达时被遍历,其中C可能位于从A到B的路径中。因此,AC被遍历了两次。 我们需要计算图中每个边的所有遍历。 谁能帮我解决这个算法?
答案 0 :(得分:0)
给出最小生成树 M = { V , E }和边沿(i,j)
,让 L = { V L , E L }和 R = { V R , E R }是通过删除边线{{1}而创建的两个子图(树) },来自 M 。边缘(i,j)
仅与路径(i,j)
交叉,其中(u,v)
在 L 中,而u
在 R 中(或相反亦然)。由于 L 中的所有顶点都已连接到 R 中的所有顶点,并且从顶点v
到顶点u
的所有路径都是唯一的,因此边缘v
越过的时间是| V L | x | V R |。 >
要查找每个边的一侧上的顶点数量,所需要做的就是从任意节点开始的一次深度优先遍历,返回(i,j)
,它是{{1}的总和}(对于每个子节点)+1(对于当前节点)。因此,叶节点的nodeCount
为1。
将父顶点从递归调用传递给子节点的邻接列表中删除,这样就不会对节点进行多次计数。
因此,如本子图中所示,如果我们从顶点 R 到达顶点 p ,
nodeCount
返回到 R 的nodeCount
将是 R
|
|
p
/ \
/ \
c1 c2
。如果 c1 和 c2 都是叶节点,则返回的nodeCount
将为3。
在此过程结束时,返回的每个1 + nodeCount(c1) + nodeCount(c2)
值将是对应边的 one 侧的节点数。该边另一侧的节点数将由nodeCount
给出,其中nodeCount
是MST中的顶点数。通过该边缘的路径数为
N - nodeCount
下面是一些伪代码,希望可以使它们有所澄清:
N
正如我所说,对于初始调用,我们使用一个任意节点。不论使用哪一个都无所谓,因为所有答案都是相等的(每个边的一个侧的正确计数,尽管不一定是 same 侧)。初始调用隐式生成一个虚拟顶点作为第一个节点的父节点,因此最后返回的nodeCount * (N - nodeCount)
等于 N ,即MST中的顶点数。
这是一个10个顶点的样本邻接矩阵,从顶点0开始时从函数输出:
CountNodes(A, r)
// Given adjacency matrix A, returns the number of nodes
// reachable from node r (including r itself)
nodeCount = 1 // include root node in count
// rows/columns in A for visited nodes should be all 0
// so that we don't count this node multiple times
// update node r as visited before recursive call to CountNodes
A[r,] = 0
A[,r] = 0
if the number of unvisited children of r is 0
return nodeCount // r is a leaf, nodeCount = 1
end if
for each node c connected to r
// get count of nodes in subtree rooted at c
childCount = CountNodes(A, c)
PRINT (r,c) = childCount // display count for current edge
nodeCount = nodeCount + childCount // update count to report to parent
end for
return nodeCount
end CountNodes
由于边缘nodeCount
的{{1}}为A =
0 1 0 0 0 0 0 0 0 0
1 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 1
0 0 0 1 0 0 0 1 1 0
0 0 0 0 1 0 1 0 0 0
0 0 1 0 0 1 1 0 0 0
0 0 0 0 0 1 0 0 0 0
(6,3) = 1
(8,2) = 1
(5,9) = 1
(8,5) = 2
(6,8) = 4
(7,6) = 6
(4,7) = 7
(1,4) = 8
(0,1) = 9
return = 10
,因此通过边缘nodeCount
的路径数为(6,8)
。通过边缘4
的路径数将为(6,8)