_drupal_depth_first_search
function _drupal_depth_first_search
_drupal_depth_first_search(&$graph, &$state, $start, &$component = NULL)
Performs a depth-first search on a graph.
Parameters
$graph: A three dimensional associated graph array.
$state: An associative array. The key 'last_visit_order' stores a list of the vertices visited. The key components stores list of vertices belonging to the same the component.
$start: An arbitrary vertex where we started traversing the graph.
$component: The component of the last vertex.
See also
File
- includes/graph.inc, line 90
- Directed acyclic graph manipulation.
Code
function _drupal_depth_first_search(&$graph, &$state, $start, &$component = NULL) { // Assign new component for each new vertex, i.e. when not called recursively. if (!isset($component)) { $component = $start; } // Nothing to do, if we already visited this vertex. if (isset($graph[$start]['paths'])) { return; } // Mark $start as visited. $graph[$start]['paths'] = array(); // Assign $start to the current component. $graph[$start]['component'] = $component; $state['components'][$component][] = $start; // Visit edges of $start. if (isset($graph[$start]['edges'])) { foreach ($graph[$start]['edges'] as $end => $v) { // Mark that $start can reach $end. $graph[$start]['paths'][$end] = $v; if (isset($graph[$end]['component']) && $component != $graph[$end]['component']) { // This vertex already has a component, use that from now on and // reassign all the previously explored vertices. $new_component = $graph[$end]['component']; foreach ($state['components'][$component] as $vertex) { $graph[$vertex]['component'] = $new_component; $state['components'][$new_component][] = $vertex; } unset($state['components'][$component]); $component = $new_component; } // Only visit existing vertices. if (isset($graph[$end])) { // Visit the connected vertex. _drupal_depth_first_search($graph, $state, $end, $component); // All vertices reachable by $end are also reachable by $start. $graph[$start]['paths'] += $graph[$end]['paths']; } } } // Now that any other subgraph has been explored, add $start to all reverse // paths. foreach ($graph[$start]['paths'] as $end => $v) { if (isset($graph[$end])) { $graph[$end]['reverse_paths'][$start] = $v; } } // Record the order of the last visit. This is the reverse of the // topological order if the graph is acyclic. $state['last_visit_order'][] = $start; }
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/includes!graph.inc/function/_drupal_depth_first_search/7.x