【问题标题】:Given an adjacency list of a bidirectional graph, how to return a collection containing all possible paths from the root node of a certain length?给定一个双向图的邻接表,如何返回一个集合,该集合包含从一定长度的根节点开始的所有可能路径?
【发布时间】:2015-03-11 16:37:39
【问题描述】:

我有一个节点的邻接图(在双向图中),我想知道如何打印从某个长度的根开始的所有可能路径。结果,允许重复。 例如,给定下图

    1
   / \  
  2   3
 /     \
4       5

用邻接表表示:

1 [2 3]  
2 [1 4]  
3 [1 5]  
4 [2]  
5 [3]

如何从长度为 4 的根节点返回所有路径的集合?我正在寻找使用 Java,但只是一个算法解决方案会有很大帮助。可能路径的一些示例。树不一定是二元的:

1 -> 2 -> 1 -> 3  
1 -> 2 -> 4 -> 2  
1 -> 3 -> 5 -> 3  
1 -> 3 -> 1 -> 3  
1 -> 2 -> 1 -> 2  
1 -> 3 -> 1 -> 2

这将表示为:

[1213,
1242,
1353,
1313,
1212,
1312] 

我一直在尝试应用深度优先搜索算法的一些变体,但我不确定如何跟踪节点。

【问题讨论】:

  • 返回和打印有很大的不同,尤其是涉及到递归。
  • 对不起,在操作中澄清了。
  • 并非如此。标题仍然是“打印”,帖子说的是“返回”。旁注:您的问题基本上是如何跟踪路径。有很多例子可以说明如何做到这一点。

标签: java algorithm search graph depth-first-search


【解决方案1】:

您应该使用DFS,它会跟踪“我还剩下多少个节点”(剩余距离)。

每个节点递归调用其所有邻居的DFS,当到达剩余节点数为0的情况时,停止并打印当前路径。

伪代码:

DFS(source, distance):
   List current = new LinkedList()
   DFS(source,distance,current)
DFS(source,distance,soFar):
   if (distance == 0): //stopping when distance is reached
      print (soFar + source) //never added the last node, doing it now
   else:
      soFar.append(source) 
      for each neighbour v of source:
         DFS(v,distance-1,soFar) //recursively call with shorter distance left
      soFar.removeLast() //remove the source that was added to the list

【讨论】:

  • 我不确定“我还剩下多少节点”是什么意思。在大型图中,我不会到达所有节点,而是所有节点距离根节点设置距离 x 边。
  • 他的意思是距离/深度。
  • @keyser 在结束方法之前清理,假设 soFar 是一个引用,你需要清理你添加的元素,否则你只会聚合所有路径的所有元素,而不仅仅是单个路径中的元素.
  • 有道理,回溯。我不知道为什么我认为它们是作为值传递的。
  • 我将实施您的算法解决方案并验证它是否有效,非常感谢!只是为了澄清-源是根节点,距离指定的根的距离吗?此外,列表 SoFar 包含一个路径的当前路径,而不是所有路径,对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 2011-04-27
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多