Depth-first search (DFS) code in python

后端 未结 7 1425
暖寄归人
暖寄归人 2021-01-02 13:34

Can you please let me know what is incorrect in below DFS code. It\'s giving correct result AFAIK, but I don\'t know when it will fail.

graph1 = {
    \'A\'          


        
相关标签:
7条回答
  • 2021-01-02 13:44

    DFS implementation in Python

    from collections import defaultdict
    
    class Graph:
        def __init__(self):
            self.graph = defaultdict(list)
    
        def addEdge(self, u, v):
            self.graph[u].append(v)
    
        def DFSUtil(self, v, visited):
            visited[v]=True
            print(v)
    
            for i in self.graph[v]:
                if visited[i] == False:
                    self.DFSUtil(i, visited)
    
        def DFS(self):
            V = len(self.graph)
    
            visited = [False]*(V)
    
            for i in range(V):
                if visited[i] == False:
                    self.DFSUtil(i, visited)
    
    # Driver code
    # Create a graph given in the above diagram
    g = Graph()
    g.addEdge(0, 1)
    g.addEdge(0, 2)
    g.addEdge(1, 2)
    g.addEdge(2, 0)
    g.addEdge(2, 3)
    g.addEdge(3, 3)
    
    print("Following is Depth First Traversal")
    g.DFS()
    

    Source :: this

    0 讨论(0)
  • 2021-01-02 13:47

    Here is a more versatile algorithm, the one asked in the question works only for undirected graphs. But this hopefully works for both them. Check it out

    graph1= {
    'A' : ['B','S'],
    'B' : [],
    'C' : ['E','S'],
    'D' : ['C'],
    'E' : ['H'],
    'F' : ['C'],
    'G' : ['F','S'],
    'H' : ['G'],
    'S' : []
    }
    visited = []
    
    def dfs_visit(graph, s):
        global visited
        for v in graph[s]:
            if v not in visited:
                visited.append(v)
                dfs_visit(graph, v)
    
    
    def dfs(graph):
        global visited
        for v in [*graph]:
            if v not in visited:
                visited.append(v)
                dfs_visit(graph,v)
    
    dfs(graph1)
    print(visited)
    
    0 讨论(0)
  • 2021-01-02 13:48
    from collections import defaultdict
    
    class Graph:
        def __init__(self):
            self.graph = defaultdict(list)
    
        def addEdge(self,u,v):
            self.graph[u].append(v)
    
        def DFS(self,v,vertex):
            visited = [False]*vertex
            print(self. graph)
            # print(len(self.graph),"+++")
            self.DFSUtil(v,visited)
    
        def DFSUtil(self,v,visited):
            visited[v]=True
            print(v)
    
            for i in self.graph[v]:
                if visited[i] == False:
                    # print(visited)
                    self.DFSUtil(i,visited)
    g= Graph()
    
    vertex=7
    
    g.addEdge(0,1)
    g.addEdge(0,2)
    g.addEdge(0,6)
    g.addEdge(0,5)
    g.addEdge(5,3)
    g.addEdge(5,4)
    g.addEdge(4,3)
    g.addEdge(6,4)
    
    g.DFS(0,vertex) 
    

    This is the modification for the above code because that doesn't work with in all cases.
    We have to specify the number of vectors and then give edges manually.

    0 讨论(0)
  • 2021-01-02 13:48
     graph = {'A': ['B', 'C'],
             'B': ['A', 'D', 'E'],
             'C': ['A', 'F'],
             'D': ['B'],
             'E': ['B', 'F'],
             'F': ['C', 'E']}
    
       def dfs(s,d):
        def dfs_helper(s,d):
            if s == d:
                return True
            if  s in visited :
                return False
            visited.add(s)
            for c in graph[s]:
                dfs_helper(c,d)
            return False
        visited = set()
        return dfs_helper(s,d) 
    dfs('A','E') ---- True
    dfs('A','M') ---- False
    
    0 讨论(0)
  • 2021-01-02 13:49

    Without recursion:

    def dfs(graph, node):
        visited = [node]
        stack = [node]
        while stack:
            node = stack[-1]
            if node not in visited:
                visited.extend(node)
            remove_from_stack = True
            for next in graph[node]:
                if next not in visited:
                    stack.extend(next)
                    remove_from_stack = False
                    break
            if remove_from_stack:
                stack.pop()
        return visited
    
    print (dfs(graph1, 'A'))
    

    Output:

    ['A', 'B', 'S', 'C', 'D', 'E', 'H', 'G', 'F']
    
    0 讨论(0)
  • 2021-01-02 13:50

    Here's an iterative (non-recursive) implementation of a DFS:

    def dfs_iterative(graph, start_vertex):
        visited = set()
        traversal = []
        stack = [start_vertex]
        while stack:
            vertex = stack.pop()
            if vertex not in visited:
                visited.add(vertex)
                traversal.append(vertex)
                stack.extend(reversed(graph[vertex]))   # add vertex in the same order as visited
        return traversal
    
    test_graph = {
        'A' : ['B','S'],
        'B' : ['A'],
        'C' : ['D','E','F','S'],
        'D' : ['C'],
        'E' : ['C','H'],
        'F' : ['C','G'],
        'G' : ['F','S'],
        'H' : ['E','G'],
        'S' : ['A','C','G']
    }
    
    print(dfs_iterative(test_graph, 'A'))
    

    Output:

    ['A', 'B', 'S', 'C', 'D', 'E', 'H', 'G', 'F']

    0 讨论(0)
提交回复
热议问题