深入查找所有可能的路径首先在图中搜索

时间:2015-11-27 01:47:12

标签: c++ graph

我试图从图中的一个节点找到所有可能的路径,这些路径将访问图中的所有其他节点。我希望函数在我的n * m图中产生所有路径可能性。我的图中的每个节点都有一个所有邻居节点的向量和一个布尔值,用于检查节点是否被访问过。

示例:

a  b

c  d

将产生:

abcd
abdc
acbd
...

我在this回答中尝试了解决方案,但只返回一条路径。我怎样才能产生所有可能的路径?

1 个答案:

答案 0 :(得分:0)

在某些情况下,您的描述似乎可能有无限路径和无限长度的路径,因为您没有指定无法重新访问节点。

您应该实现深度优先搜索,并在递归DFS方法中传递对标记(已访问)节点数组的引用,假设您对图中的节点数进行了计数。在您访问每个节点之后,在离开该节点之前,请确保再次将其设置为false,以便可以通过另一个节点重新访问该节点。

这个算法的实现实际上取决于你如何实现你的图形结构而没有细节,我所能做的就是推测你有一个带有代表不同节点的邻接列表的链接结构。我也不知道不同的节点如何映射到字符,这是我必须推测的另一个细节,但是说节点用整数表示。

您需要将以下内容传递给DFS方法:标记节点数组,包含路径信息的链表,起始节点(即当前节点)和最终节点

 void printAllPaths(LinkedList<Integer> currentPath, boolean[] marked, int current, int last){ 

    for( all nodes adjacent to current, node ){
      if(node == last){ 
         currentPath.addLast(last); 
         System.out.println(currentPath);
         currentPath.removeLast();
      }else if(!marked[node]){
         currentPath.addLast(node);
         marked[node] = true;
         printAllPaths(currentPath, marked, node, final);
         marked[node] = false;
         currentPath.removeLast();
      }
    }
 }

这将是代码的基本思想。如果它没有事先编译,我道歉,但这应该打印出所有的路径。