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

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

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

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

我们得到一个有向图,其中我们必须计算节点的数量 - 从顶点 uv 的不相交路径使得它们之间的最大节点数为 K - 2(uvK 递减,因此 K - 2)。图中的顶点数最多可达10^5,边数可达6 * 10^5。我想为每个节点实现 BFS,直到与源节点的最大距离小于 K。但我没有实现的想法。有人可以帮帮我吗?

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

最佳答案

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
 }  

}

关于algorithm - 计算节点数 - 有向图中任意两个节点之间的不相交路径,使得距离 <= K,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028344/

相关文章:

algorithm - Dijkstra 算法中边缘的松弛

graph-theory - 当一个给定的图是 3 色的?

java - 为什么这个 MinDepth 级别的解决方案与递归解决方案相比如此慢?

javascript - Javascript 中的递归不起作用(CodeWars 问题)

arrays - 有哪些方法可以查找包含特定实数值的数组元素?

algorithm - 为什么选择排序不贪心

graph-theory - OrientDB:最短路径中的边

php - 深度优先搜索中显式堆栈的实现

algorithm - 冒泡排序相似算法运行时分析

将点拟合到网格的算法