【问题标题】:How Do Implement Depth First Search Into This Code?如何在此代码中实施深度优先搜索?
【发布时间】:2015-12-11 22:29:23
【问题描述】:

在这里有点挣扎。我想实现深度优先搜索,这是一个邻接列表图。完全工作,但我对实施这样的搜索有点无能为力。在开始 DFS 之前是否需要添加堆栈类?任何帮助都会很棒!

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 "}"

【问题讨论】:

    标签: graph stack depth-first-search


    【解决方案1】:

    我想提供的不仅仅是提供伪代码,但我不太了解您使用的语言。但是在实现上快速运行

    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();
                }
            }
        }
    }
    

    【讨论】:

    • 你的高水平其实很有帮助,谢谢!如果你有这方面的经验,语言是 Python 吗?
    • 不完全是@S.Cluster,但如果你能遵循这个实现,你应该能够把它做好。如果有帮助,请将我的答案标记为正确或投票。如果您有任何疑问,请询问。谢谢。
    • 没问题老兄,无论语言如何,理论都是一样的,我很感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2014-06-02
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多