计算节点数 - 有向图中任意两个节点之间的不相交路径,使得距离<= K

时间:2017-05-17 14:55:00

标签: algorithm graph-theory depth-first-search breadth-first-search directed-graph

我们如何计算任意两个节点之间节点 - 不相交路径的数量,使两个节点之间的距离最大 K

有关节点的详细信息 - 不相交路径可以是found here

我们得到一个有向图,我们必须计算节点数 - 从顶点uv的不相交路径,使它们之间的最大节点数为K - 2({{1} }和u K 递减,因此 K - 2 )。图中的顶点数可以高于 10 ^ 5 ,边可以 6 * 10 ^ 5 。我想到为每个节点实施BFS,直到距源节点的最大距离小于 K 。但我不知道实施的想法。有人请帮帮我吗?

如果有人有想法使用DFS解决它,请分享。

1 个答案:

答案 0 :(得分:0)

DFS 是解决此类问题的关键。我们可以使用DFS轻松枚举2个顶点之间的所有可能路径,但我们必须处理距离约束

我的算法将遍历的边数视为约束。您可以轻松地将其转换为遍历的节点数。把它作为一个练习。

我们跟踪变量e遍历的边数。如果e大于K - 2,我们会终止该递归DFS来电。

为了保持访问过顶点,我们保留boolean数组visited。但是,如果递归调用在没有找到成功路径的情况下终止,我们将放弃对数组visited所做的任何更改。

只有在递归DFS调用成功找到路径时,我们才会为该程序的其余部分保留visited数组。

所以算法的伪代码是:

main function()
{
 visited[source] = 1     
 e = 0//edges traversed so far.
 sum = 0// the answer
 found = false// found a path.
 dfs(source,e)
 print sum
 .
 .
 .
}

dfs(source,e)
{
 if(e > max_distance)
 {      
  return
 }

 if(e <= max_distance and v == destination)
 {
  found = true
  sum++      
  return
 }

 for all unvisited neighbouring vertices X of v
 {
  if(found and v != source)
   return;
  if(found and v == source)
  {
   found = false
   visited[destination] = 0
  }

  visited[X] = 1
  dfs(X , e + 1)
  if(!found)
   visited[X] = 1
 }  

}