LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Никакая переменная путь не хранит. Никакой отдельный путь хранить не нужно, зачем? Есть массив известных путей, он один единственный и его ни с чем не перепутать. В нём хранятся все известные пути сразу.

$ways['f'] = список путей к точке f.

И вот этот самый $ways в цикле дополняется новыми обнаруженными путями по ходу сканирования списка рёбер.

Вот мы знаем путь abef, например, его длина 12. Он записан так: $ways['f']['abef'] = 12.

Смотрим список рёбер, идущих от f: 'f' => array('g'=>2, 'h'=>9, 'j'=>5, 'z'=>3), и вот, был abef=12 а теперь есть ещё abefg = 12+2, abefh = 12+9, abefj = 12+5, abefz = 12+3 (откуда это взялось надеюсь не надо объяснять). Эти пути мы нигде по-отдельности не храним (зачем?), а сразу записываем в тот же массив $ways:

$ways['g']['abefg'] = 14;
$ways['h']['abefh'] = 21;
$ways['j']['abefj'] = 17;
$ways['z']['abefz'] = 15;
В конце работы, когда все рёбра просмотрели, в $ways['z'] скапливается список путей до 'z', который нам и нужен.

Исходная версия firkax, :

Никакая переменная путь не хранит. Никакой отдельный путь хранить не нужно, зачем? Есть массив известных путей, он один единственный и его ни с чем не перепутать.

$ways['f'] = список путей к точке f.

И вот этот самый $ways в цикле дополняется новыми обнаруженными путями по ходу сканирования списка рёбер.

Вот мы знаем путь abef, например, его длина 12. Он записан так: $ways['f']['abef'] = 12.

Смотрим список рёбер, идущих от f: 'f' => array('g'=>2, 'h'=>9, 'j'=>5, 'z'=>3), и вот, был abef=12 а теперь есть ещё abefg = 12+2, abefh = 12+9, abefj = 12+5, abefz = 12+3 (откуда это взялось надеюсь не надо объяснять). Эти пути мы нигде по-отдельности не храним (зачем?), а сразу записываем в тот же массив $ways:

$ways['g']['abefg'] = 14;
$ways['h']['abefh'] = 21;
$ways['j']['abefj'] = 17;
$ways['z']['abefz'] = 15;
В конце работы, когда все рёбра просмотрели, в $ways['z'] скапливается список путей до 'z', который нам и нужен.