CSCE 411 Lecture 17
		
		
		
		
		
		Jump to navigation
		Jump to search
		
		
	
« previous | Wednesday, October 3, 2012 | next »
Graphs
BFS Running Time
- Initialization takes time.
 - Every node is enqueued and dequeued once, taking time.
 - When a node is dequeued, all its neighbors are checked to see if they are unvisited, taking time proportional to the number of neighbors, summing to
 
Total time is
Depth-First Search (DFS)
def depth_first_search graph
  graph.each_node do |u|
    u.visited = false
  end
  graph.each_node do |u|
    recursive_dfs u
  end
end
def recursive_dfs source
  source.visited = true
  source.neighbors.select{|v| not v.visited?}.each do |v|
    recursive_dfs v
  end
endDFS is called on all nodes to make sure that we visit all nodes (helps with disconnected graph)
Like BFS, if we keep track of parents, we construct a forest resulting from the DFS traversal.
def depth_first_search graph
  graph.each_node do |u|
    u.visited = false
    u.parent = nil                      #!
  end
  graph.each_node do |u|
    u.parent = u                        #!
    recursive_dfs u
  end
end
def recursive_dfs source
  source.visited = true
  source.neighbors.select{|v| not v.visited?}.each do |v|
    v.parent = source                   #!
    recursive_dfs v
  end
endTwo more interesting pieces of information:
- discovery time: when recursive call starts
 - finish time: when recursive call ends
 
def depth_first_search graph
  graph.each_node do |u|
    u.visited = false
    u.parent = nil
  end
  $time = 0                             #!
  graph.each_node do |u|
    u.parent = u
    recursive_dfs u
  end
end
def recursive_dfs source
  source.visited = true
  $time += 1                            #!
  source.discovery_time = $time         #!
  source.neighbors.select{|v| not v.visited?}.each do |v|
    v.parent = source
    recursive_dfs v
    $time += 1                          #!
    source.finish_time = $time          #!
  end
endDFS Running Time
- Initialization:
 - Non-recursive wrapper:
 - Recursive call checks all neighbors; so total time in all recursive calls is
 
Total time is
Nested Intervals
Let v.interval for vertex be (v.discovery .. v.finish).
For any two nodes, either one interval precedes the other one or one is enclosed in the other one
- maximal "disjoint" time intervals represent DFS traversal of a "connected component"
 - They will not overlap because overlapping implies a recursive call starts before the other one ends.
 
Corollary: is a descendent of ind the DFS forest iff the time interval of is contained within the interval of
Classifying Edges
Consider a directed graph formed by DFS forest.
- tree edge
 - is a child of
 - back edge
 - is an ancestor of
 - forward edge
 - is a descendent of , but not a child.
 - cross edge
 - none of the above.