Реализация алгоритма обхода графа в глубину на PHP
http://shujkova.ru/sites/default/files/lec7.pdf - оригинальный документ, в котором подробно описан алгоритм на C++.
Реализация на PHP:
// представление графа в виде списка смежности $graph = [ 0 => [1, 2, 3], 1 => [0, 4, 8], 2 => [0, 5], 3 => [0, 6, 7], 4 => [1], 5 => [2], 6 => [3], 7 => [3, 9], 8 => [1], 9 => [7], ]; $used = []; $time_in = []; $time_out = []; $time = 0; // функция обхода графа глубину (depth-first search) function dfs($v, &$used, &$time_in, &$time_out, &$time, $graph){ print "v = $v"; $used[$v] = 1; $time_in[$v] = $time; $time++; foreach ($graph[$v] as $el){ if (empty($used[$el])){ dfs($el, $used, $time_in, $time_out, $time, $graph); } } $time_out[$v] = $time; $time++; } dfs(0, $used, $time_in, $time_out, $time, $graph); $result = []; for ($i = 0; $i < 10; $i++){ $result[$i]['time_in'] = $time_in[$i]; $result[$i]['time_out'] = $time_out[$i]; } print $result;
Результат будет следующий:
v = 0 v = 1 v = 4 v = 8 v = 2 v = 5 v = 3 v = 6 v = 7 v = 9
То есть в таком порядке алгоритм обходил вершины: 0, 1, 4, 8, 2, 5, 3, 6, 7, 9.
Массив $result
содержит номер шага входа в каждую вершину и выхода из неё. Результат будет следующий:
Array ( [0] => Array ( [time_in] => 0 [time_out] => 19 ) [1] => Array ( [time_in] => 1 [time_out] => 6 ) [2] => Array ( [time_in] => 7 [time_out] => 10 ) [3] => Array ( [time_in] => 11 [time_out] => 18 ) [4] => Array ( [time_in] => 2 [time_out] => 3 ) [5] => Array ( [time_in] => 8 [time_out] => 9 ) [6] => Array ( [time_in] => 12 [time_out] => 13 ) [7] => Array ( [time_in] => 14 [time_out] => 17 ) [8] => Array ( [time_in] => 4 [time_out] => 5 ) [9] => Array ( [time_in] => 15 [time_out] => 16 ) )