Реализация алгоритма обхода графа в глубину на 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
)
)