this is DFS.py file where I am trying to track down the algorithm execution using bunch of print statements,
=================DFS.py=========================== from graphs import Graph, Vertex class DFSGraph(Graph): def __init__(self): super().__init__() self.time = 0 def dfs(self): for aVertex in self: aVertex.setColor('white') aVertex.setPred(-1) self.dfsvisit(aVertex) def dfsvisit(self, startVertex): print("vertex {}: color {}".format(startVertex, startVertex.getColor())) print("setting color gray") startVertex.setColor('gray') print("vertex {}: color {}".format(startVertex, startVertex.getColor())) self.time += 1 startVertex.setDiscovery(self.time) print("setting discovery time {} for vertex, {}".format(startVertex.getDiscovery(),startVertex )) for nextVertex in startVertex.getConnections(): print("connections for vertex {} are {}. ".format(startVertex, startVertex.getConnections())) print(" LOOP: vertex {}: color {}".format(nextVertex, nextVertex.getColor())) if nextVertex.getColor() == 'white': nextVertex.setPred(startVertex) print("RECURSION: making recursive call on vertex {}".format(nextVertex)) self.dfsvisit(nextVertex) print("setting color black") startVertex.setColor('black') print("vertex {}: color {}".format(startVertex, startVertex.getColor())) self.time += 1 startVertex.setFinish(self.time) print("setting finish time {} for vertex, {}".format(startVertex.getFinish(), startVertex )) if __name__ == '__main__': g = DFSGraph() g.addVertex('a') g.addVertex('b') g.addVertex('c') g.addVertex('d') g.addVertex('e') g.addVertex('f') a = g.getVertex('a') b = g.getVertex('b') c = g.getVertex('c') d = g.getVertex('d') e = g.getVertex('e') f = g.getVertex('f') g.addEdge(a,b) g.addEdge(a,d) g.addEdge(b,c) g.addEdge(b,d) g.addEdge(d,e) g.addEdge(e,b) g.addEdge(e,f) g.addEdge(f,c) g.dfs()
this is graphs.py file which is being used to create a Graph.
class Vertex: def __init__(self, key): self.id = key self.connectedTo = {} self.distance = 0 self.color = "white" self.pred = None self.disc = 0 self.fin = 0 def addNeighbor(self, nbr, weight=0): self.connectedTo[nbr] = weight def __str__(self): return str(self.id) def getConnections(self): return self.connectedTo.keys() def getId(self): return self.id def getWeight(self, nbr): return self.connectedTo[nbr] def setDistance(self, distance): self.distance = distance def setPred(self, pred): self.pred = pred def getDistance(self): return self.distance def setColor(self, color): self.color = color def getColor(self): return self.color def setDiscovery(self,dtime): self.disc = dtime def getDiscovery(self): return self.disc def setPred(self,p): self.pred = p def getPred(self): return self.pred def setFinish(self,ftime): self.fin = ftime def getFinish(self): return self.fin class Graph: def __init__(self): self.vertList = {} self.numVertices = 0 def addVertex(self, key): self.numVertices = self.numVertices + 1 self.vertList[key] = Vertex(key) return Vertex(key) def getVertex(self, key): return self.vertList.get(key) def __contains__(self, n): return n in self.vertList def addEdge(self, origin, destination, cost=0): if origin not in self.vertList: self.addVertex(origin) if destination not in self.vertList: self.addVertex(destination) self.vertList.get(origin).addNeighbor(self.vertList.get(destination), cost) def getVertices(self): return self.vertList.keys() def __iter__(self): return iter(self.vertList.values())
============= Output is really wrong and I am not sure why all vertexes are marked gray and black in the beginning π =============
$ ipython DFS.py vertex a: color white setting color gray vertex a: color gray setting discovery time 1 for vertex, a setting color black vertex a: color black setting finish time 2 for vertex, a vertex b: color white setting color gray vertex b: color gray setting discovery time 3 for vertex, b setting color black vertex b: color black setting finish time 4 for vertex, b vertex c: color white setting color gray vertex c: color gray setting discovery time 5 for vertex, c setting color black vertex c: color black setting finish time 6 for vertex, c vertex d: color white setting color gray vertex d: color gray setting discovery time 7 for vertex, d setting color black vertex d: color black setting finish time 8 for vertex, d vertex e: color white setting color gray vertex e: color gray setting discovery time 9 for vertex, e setting color black vertex e: color black setting finish time 10 for vertex, e vertex f: color white setting color gray vertex f: color gray setting discovery time 11 for vertex, f setting color black vertex f: color black setting finish time 12 for vertex, f vertex a: color white setting color gray vertex a: color gray setting discovery time 13 for vertex, a connections for vertex a are dict_keys([<graphs.Vertex object at 0x10f116e10>, <graphs.Vertex object at 0x10f1164e0>]). LOOP: vertex b: color white RECURSION: making recursive call on vertex b vertex b: color white setting color gray vertex b: color gray setting discovery time 14 for vertex, b connections for vertex b are dict_keys([<graphs.Vertex object at 0x10f116ef0>, <graphs.Vertex object at 0x10f1164e0>]). LOOP: vertex c: color white RECURSION: making recursive call on vertex c vertex c: color white setting color gray vertex c: color gray setting discovery time 15 for vertex, c setting color black vertex c: color black setting finish time 16 for vertex, c connections for vertex b are dict_keys([<graphs.Vertex object at 0x10f116ef0>, <graphs.Vertex object at 0x10f1164e0>]). LOOP: vertex d: color white RECURSION: making recursive call on vertex d vertex d: color white setting color gray vertex d: color gray setting discovery time 17 for vertex, d connections for vertex d are dict_keys([<graphs.Vertex object at 0x10f116f28>]). LOOP: vertex e: color white RECURSION: making recursive call on vertex e vertex e: color white setting color gray vertex e: color gray setting discovery time 18 for vertex, e connections for vertex e are dict_keys([<graphs.Vertex object at 0x10f116e10>, <graphs.Vertex object at 0x10f116eb8>]). LOOP: vertex b: color gray connections for vertex e are dict_keys([<graphs.Vertex object at 0x10f116e10>, <graphs.Vertex object at 0x10f116eb8>]). LOOP: vertex f: color white RECURSION: making recursive call on vertex f vertex f: color white setting color gray vertex f: color gray setting discovery time 19 for vertex, f connections for vertex f are dict_keys([<graphs.Vertex object at 0x10f116ef0>]). LOOP: vertex c: color black setting color black vertex f: color black setting finish time 20 for vertex, f setting color black vertex e: color black setting finish time 21 for vertex, e setting color black vertex d: color black setting finish time 22 for vertex, d setting color black vertex b: color black setting finish time 23 for vertex, b connections for vertex a are dict_keys([<graphs.Vertex object at 0x10f116e10>, <graphs.Vertex object at 0x10f1164e0>]). LOOP: vertex d: color black setting color black vertex a: color black setting finish time 24 for vertex, a vertex b: color white setting color gray vertex b: color gray setting discovery time 25 for vertex, b connections for vertex b are dict_keys([<graphs.Vertex object at 0x10f116ef0>, <graphs.Vertex object at 0x10f1164e0>]). LOOP: vertex c: color black connections for vertex b are dict_keys([<graphs.Vertex object at 0x10f116ef0>, <graphs.Vertex object at 0x10f1164e0>]). LOOP: vertex d: color black setting color black vertex b: color black setting finish time 26 for vertex, b vertex d: color white setting color gray vertex d: color gray setting discovery time 27 for vertex, d connections for vertex d are dict_keys([<graphs.Vertex object at 0x10f116f28>]). LOOP: vertex e: color black setting color black vertex d: color black setting finish time 28 for vertex, d vertex c: color white setting color gray vertex c: color gray setting discovery time 29 for vertex, c setting color black vertex c: color black setting finish time 30 for vertex, c vertex e: color white setting color gray vertex e: color gray setting discovery time 31 for vertex, e connections for vertex e are dict_keys([<graphs.Vertex object at 0x10f116e10>, <graphs.Vertex object at 0x10f116eb8>]). LOOP: vertex b: color black connections for vertex e are dict_keys([<graphs.Vertex object at 0x10f116e10>, <graphs.Vertex object at 0x10f116eb8>]). LOOP: vertex f: color black setting color black vertex e: color black setting finish time 32 for vertex, e vertex f: color white setting color gray vertex f: color gray setting discovery time 33 for vertex, f connections for vertex f are dict_keys([<graphs.Vertex object at 0x10f116ef0>]). LOOP: vertex c: color black setting color black vertex f: color black setting finish time 34 for vertex, f