from cs4102lib import Graph, Queue def dfs0(graph, start): visited = {} dfs_recurs0(graph, start, visited) def dfs_recurs0(graph, curnode, visited): visited[curnode] = True alist = graph.get_adjlist(curnode) for v in alist: #if not visited.has_key(v): # same as next line if v not in visited: print " dfs_recurs0 traversing edge:", curnode, v dfs_recurs0(graph, v, visited) else: print "backedge", curnode, v # end for-all adj vertices return def dfs1(graph, start): color = {} dfs_nums = {} edge_info = [] for v in graph: color[v] = "white" dfs_nums[v] = None dfs_recurs1(graph, start, color, dfs_nums, 0, None, edge_info) print "\ndfs1 results:" print "\tvertex\t(disc,fin)" for v in graph: print "\t", v, "\t", dfs_nums[v] print "Classification of edges:" print "Tree:", map(lambda t: t[1:], filter(lambda t: t[0]=="tree", edge_info)) print "Back:", map(lambda t: t[1:], filter(lambda t: t[0]=="back", edge_info)) print "Other:", map(lambda t: t[1:], filter(lambda t: t[0]=="other", edge_info)) def dfs_recurs1(graph, curnode, color, dfs_nums, ctr, parent, edge_info): color[curnode] = "gray" ctr = ctr + 1 discovered = ctr alist = graph.get_adjlist(curnode) for v in alist: if color[v] == "white": edge_info.append( ("tree", curnode, v) ) ctr = dfs_recurs1(graph, v, color, dfs_nums, ctr, curnode, edge_info) elif color[v] == "gray" and v != parent: edge_info.append( ("back", curnode, v) ) elif color[v] == "black": edge_info.append( ("other", curnode, v) ) # end for-all adj vertices ctr = ctr + 1 finished = ctr color[curnode] = "black" dfs_nums[curnode] = (discovered, finished) print " dfs_recurs1 assigning (disc,fin) for: ", curnode, discovered, finished return ctr def main(): g1 = { "a": ["b", "f", "g"], "b": ["a", "c", "d", "e"], "c": ["b", "e"], "d": ["b", "e", "f"], "e": ["b", "c", "d", "f", "g"], "f": ["a", "d", "e"], "g": ["a", "e"], "h":[] } gr1 = Graph(g1) print gr1.num_nodes(), gr1.num_edge_items()/2 print gr1 print "\nCalling basic dfs:" dfs0(gr1, "a") #print "\nCalling more complex dfs:" #dfs1(gr1, "a") main()