我想找到从特定节点开始到特定节点结束的所有可能路径。我尝试在java中进行深度优先搜索,但它对我的情况不起作用。因为我的路径将朝同一方向发展。我不想遍历所选择的所有其他节点。
我无法上传显示我想要的图片。无论如何,我会试着解释一下。 节点之中
0 1 2 3 4 5 6 7 8 9
我想要找到的路径,例如,将从2到9开始。算法产生的可能路径应为
2-7-9
2-4-6-8-9
2-4-6-9
对于node-1,我的下一个可能性是node-2,所以我不会尝试节点0和节点-3。由于我设置了一些特殊规则,只有node-2适合node-1。选择节点-2,节点-4和节点7的下一个节点。对于节点-4,仅节点6是合适的。对于节点-6,节点8和节点9是合适的。另一方面,对于node-7,下一个节点仅为9。
创建所有这些路径并将其保存在散列图或列表结构中。
DFS查找路径,例如0-1到1-3之间的路径,这对我来说是不可接受的。由于算法的性质,它找到了最短的路径。我希望所有可能性根据规则而不是最短的规则。规则不是问题,所以我不想让你感到困惑和无聊。解决这个问题的一般方法对我来说很重要。
提前致谢
答案 0 :(得分:0)
您需要使用breadth-first search来使用Queue。
在重新阅读您的问题后编辑我认为问题在于您如何表示方向图,而不是您选择的算法。 DFS或BFS都适用于您的情况,但您需要正确实现图形,以便算法知道不会尝试错误的路径。
DFS查找路径,例如0-1到1-3之间的路径,这对我来说是不可接受的。由于算法的性质,它找到了最短的路径。我希望所有可能性根据规则而不是最短的规则。
实际上, BFS 通常用于查找最短路径,而两者都可用于查找所有可能的路径。我会坚持使用DFS,因为它更容易实现(使用递归而不是Queue
等)。
答案 1 :(得分:0)
如果您代表您的节点&正确地规则,算法不会找到不合法的路径。例如,如果要从节点2开始,请将其作为起始节点。
最简单的是定义一个表示节点的类。在类中有一个这个“父”的所有“子”节点的数组列表。同样在节点中有一个整数,用作深度优先行走的“光标”。 (并且还有另一个整数/字符串,即节点#或其他标识符。)
将所有节点中的整数“cursor”设置为零。选择您的起始节点 - 使其成为“当前节点”。在该节点上调用方法来遍历它。它拾取光标并提取相应的数组列表元素。然后它为该数组列表元素中的节点调用“walk”方法。返回时,“光标”会递增。
“walk”方法在到达目标节点时返回,或者当“cursor”增加到超出子数组的大小时返回。
一路上你保留你想要的任何路径记录。一种方法是传递每个“walk”调用中访问的节点的数组列表,在传递之前将当前节点添加到列表中。当步行到达终端节点时,阵列列表被复制为答案之一。从“walk”返回时,添加的元素将被删除。