да ладно, че уж :) ушло 40 минут на написание:
имеем например граф: см. внизу
для теста делаем поиск путей от индекса 0 - Маша, до индекса 9 - Стас
Красными стрелками показаны связи, учавствующие в путях (для визуальной проверки).
запускаем:
<?php
$nodes = array (
0 => 'Маша',
1 => 'Петя',
2 => 'Ваня',
3 => 'Федя',
4 => 'Таня',
5 => 'Гоша',
6 => 'Аня',
7 => 'Лида',
8 => 'Вова',
9 => 'Стас'
);
$links = array (
0 => array (0,1),
1 => array (0,2),
2 => array (0,3),
3 => array (0,4),
4 => array (0,5),
5 => array (0,7),
6 => array (0,8),
7 => array (0,9),
8 => array (1,2),
9 => array (2,3),
10 => array (2,5),
11 => array (3,4),
12 => array (3,7),
13 => array (4,5),
14 => array (4,9),
15 => array (5,9),
16 => array (6,0),
17 => array (7,6),
18 => array (8,5),
19 => array (8,7),
20 => array (9,8)
);
$startIndex = 0;
$finishIndex = 9;
$way = array();
$wayIndex = -1;
function outWay($type) {
global $nodes, $way, $wayIndex;
$w = $type . ': ';
for ($i = 0; $i <= $wayIndex; $i++) {
if ($i > 0) $arrow = ' -> '; else $arrow = '';
$w .= $arrow . $nodes[ $way[$i] ];
}
echo $w . '<br>';
}
function step($nodeIndex) {
global $nodes, $links, $way, $wayIndex, $startIndex, $finishIndex;
$wayIndex++;
$way[$wayIndex] = $nodeIndex;
if ($nodeIndex == $finishIndex) {
outWay('Путь');
} elseif (($nodeIndex != $startIndex) OR ($wayIndex == 0)) {
for ($i = 0; $i < count($links); $i++) {
if ($links[$i][0] == $nodeIndex) {
step($links[$i][1]);
}
}
} else {
outWay('Замыкание');
}
$wayIndex--;
}
step($startIndex);
echo '<br>Выполнено';
?>
результаты: