计算最小生成树中从顶点u到v的所有路径的边被访问的次数,其中u!= v

时间:2019-02-05 10:46:43

标签: graph-theory graph-algorithm

给出从 u v 的所有路径的MST查找,其中u!= v,遍历图形中每个边的次数。 例如,图中的边AC可以在从A到C或从A到B到达时被遍历,其中C可能位于从A到B的路径中。因此,AC被遍历了两次。 我们需要计算图中每个边的所有遍历。 谁能帮我解决这个算法?

1 个答案:

答案 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)