我有一个功课,我需要在java中实现DFS。 这个伪代码用于任务1。
DFS(V,E,s)
foreach u ∈ V
vis(u) <-- 0
p[u] <-- NULL
DFS-Visit(u)
vis(u) <-- 1
work through u here foreach neighbor v to u
if vis(u) = 0
p[v] = u
DFS-Visit(v)
到目前为止,这就是我所得到的:
package kth.id2010.lab.lab05;
public class DFS {
private static boolean[] visited;
private static int[] path;
static void DFS(int vertecies[], int edges[], int sourceVertex){
for(int i = 0; i < vertecies.length; i++){
visited[i] = false;
dfsVisit(i);
}
}
static void dfsVisit(int u){
visited[u] = true;
}
}
因此,如果我认为我已经完成了我需要通过你的邻居对你工作的部分。 而且我并不确定如何做到这一点。
答案 0 :(得分:0)
好吧,如果它只是通过邻居的迭代,那么这里是一个开始的地方:
DFS意味着您希望在转移到第二个邻居之前一直扩展节点,因此,正如您可能已经教过的那样,这是一种先进先出的方法。实际上,您可以从空Stack对象开始,并使用Stack.push()将第一个节点添加到它。然后你可以做while !Stack.empty(): Stack.pop()
。这将删除插入的最后一个元素。然后以递归方式遍历每个元素(在for循环中调用此方法)并重复,直到邻居用完为止,此时只返回任何内容。
现在的问题是这些'元素'是什么?如果您正在推送[start,end]
的数组,那么当您弹出它时,您需要反馈到递归的邻居是什么?好吧,如果你仔细想一想,你会发现具有这种表示的节点的邻居将是父节点的end
点与任何其他节点的start
点匹配的所有节点(这不是没去过。
天真的实现方式,这是一个很好的开始方式,将是以下(伪代码):
while (!Stack.empty()):
current_node = Stack.pop();
foreach node in all_nodes:
if current_node[1] == node[0] and node.not_visited_yet(): Stack.push(node)
// now we have the neighbors for this current_node pushed into the Stack
// Note that node.not_visited_yet() could be a function that keeps track of nodes
// that you already visited somehow (a map from node to boolean perhaps?)
这就是穿越你的树。当然这一切都是遍历,它没有任何意义,但这不是你的问题。例如,如果您希望在到达特定节点时返回字符串,只需将其添加到for循环下方即可。你也可以把它变成一个接收节点和堆栈的函数,而不是使用while循环,而是在你达到最终目标后返回。
function DFS (Stack, current_node): // recursive
current_node = Stack.pop();
foreach node in all_nodes:
if current_node[1] == node[0] and node.not_visited_yet(): Stack.push(node)
if not Stack.empty:
next_node = Stack.pop()
return DFS(Stack, next_node)