start = Pick any start node
search(start)
function search(node) {
node.visited = yes
for each vertex that has an edge to node (call it b): {
if (b not visited) {
search(b) // recursive call to search
}
}
}
如果您的图包含不由任何边连接的局部顶点组,该算法将无法访问所有顶点。在这种情况下,而不是
Pick any start node
您应该遍历所有节点并调用
search
已访问的根节点将被跳过。搜索后,不要忘记重置
visited
所有顶点的标志!
编辑:
如前所述,这只能找到一条路径。找到所有可能的路径:每次到达目标顶点时,都可以保存路由(可以保留每次递归调用时传递的堆栈,并添加顶点(或边),弹出如下:
start = pick your start vertex
target = pick your target vertex
stack = empty stack
search(start, start, target, stack)
resultingPaths = vector of stacks // here go all possible routes
function search(node, start, target, stack) {
for each vertex that has an edge to node (call it b): {
stack.push(b)
if (b == target) {
// we have found a path
resultingPaths.add(a copy of stack)
} else if (b != start) {
// keep looking
search(b, start, target, stack) // recursive call to search
}
stack.pop()
}
}