如何在这段代码中实现深度优先搜索?
How Do Implement Depth First Search Into This Code?
这里有点挣扎。我想实现深度优先搜索,这是一个邻接列表图。完全正常工作,但我对执行这样的搜索有点无能为力。在开始 DFS 之前是否需要添加堆栈 class?任何帮助都会很棒!
class vertex:
def __init__(self, label, edges = []):
self.id = label
self.edges = []
class graph(vertex):
def __init__(self):
self.vertices = {}
def addVertex(self, label):
self.vertices[label] = vertex(label)
return self.vertices
def addEdge(self,frm,to):
self.vertices[frm].edges = self.vertices[frm].edges + [to]
return self.vertices
def dot(self):
for v in self.vertices:
for e in self.vertices[v].edges:
print "%s -> %s;"%(v, e)
def viewVertLink(self):
for v in self.vertices:
print ""
print "Vertex:","(",v,")"
for e in self.vertices[v].edges:
print "%s -> %s;"%(v, e)
if __name__ == '__main__':
g = graph()
for i in range(10):
str(g.addVertex(i))
str(g.addEdge(0,1))
str(g.addEdge(0,2))
str(g.addEdge(1,3))
str(g.addEdge(1,4))
str(g.addEdge(2,3))
str(g.addEdge(3,5))
str(g.addEdge(4,5))
str(g.addEdge(4,6))
str(g.addEdge(6,7))
str(g.addEdge(7,1))
str(g.addEdge(7,8))
str(g.addEdge(8,9))
str(g.addEdge(9,0))
print "digraph G{"
g.dot()
print "}"
我想提供的不仅仅是伪代码,但我不太了解您使用的语言。但快速 运行 实施
Get a stack
mark your source as visited and push to stack
while stack is not empty
retrieve element on top of stack without removing it
Go through its adjacent nodes
if you find a node that has not been visited
mark it as visited and push into stack
repeat from source, except this time with the new item
else if all adjacent vertices have been visited pop the stack
这是一个 java 实现
void dfs(int adjacency_matrix[][], int source){
Stack<Integer> stack = new Stack<>();
int numNodes = adjacency_matrix[source].length -1;
boolean [] visited = new boolean[numNodes +1];
visited[source] = true;
stack.add(source);
while(!stack.isEmpty()){
int current = stack.peek(); // don't remove the element but get it
System.out.println("Current node being visited is "+current);
for(int x = 0; x <= numNodes; x++){
if(adjacency_matrix[current][x] == 1 && visited[x] == false){
visited[x] = true;
stack.push(x);
break;
}else if(x == numNodes){
stack.pop();
}
}
}
}
这里有点挣扎。我想实现深度优先搜索,这是一个邻接列表图。完全正常工作,但我对执行这样的搜索有点无能为力。在开始 DFS 之前是否需要添加堆栈 class?任何帮助都会很棒!
class vertex:
def __init__(self, label, edges = []):
self.id = label
self.edges = []
class graph(vertex):
def __init__(self):
self.vertices = {}
def addVertex(self, label):
self.vertices[label] = vertex(label)
return self.vertices
def addEdge(self,frm,to):
self.vertices[frm].edges = self.vertices[frm].edges + [to]
return self.vertices
def dot(self):
for v in self.vertices:
for e in self.vertices[v].edges:
print "%s -> %s;"%(v, e)
def viewVertLink(self):
for v in self.vertices:
print ""
print "Vertex:","(",v,")"
for e in self.vertices[v].edges:
print "%s -> %s;"%(v, e)
if __name__ == '__main__':
g = graph()
for i in range(10):
str(g.addVertex(i))
str(g.addEdge(0,1))
str(g.addEdge(0,2))
str(g.addEdge(1,3))
str(g.addEdge(1,4))
str(g.addEdge(2,3))
str(g.addEdge(3,5))
str(g.addEdge(4,5))
str(g.addEdge(4,6))
str(g.addEdge(6,7))
str(g.addEdge(7,1))
str(g.addEdge(7,8))
str(g.addEdge(8,9))
str(g.addEdge(9,0))
print "digraph G{"
g.dot()
print "}"
我想提供的不仅仅是伪代码,但我不太了解您使用的语言。但快速 运行 实施
Get a stack
mark your source as visited and push to stack
while stack is not empty
retrieve element on top of stack without removing it
Go through its adjacent nodes
if you find a node that has not been visited
mark it as visited and push into stack
repeat from source, except this time with the new item
else if all adjacent vertices have been visited pop the stack
这是一个 java 实现
void dfs(int adjacency_matrix[][], int source){
Stack<Integer> stack = new Stack<>();
int numNodes = adjacency_matrix[source].length -1;
boolean [] visited = new boolean[numNodes +1];
visited[source] = true;
stack.add(source);
while(!stack.isEmpty()){
int current = stack.peek(); // don't remove the element but get it
System.out.println("Current node being visited is "+current);
for(int x = 0; x <= numNodes; x++){
if(adjacency_matrix[current][x] == 1 && visited[x] == false){
visited[x] = true;
stack.push(x);
break;
}else if(x == numNodes){
stack.pop();
}
}
}
}