[Moscow.pm] Взрыв мозга или занимательная топология
Kaltashkin Eugene
zhecka на gmail.com
Сб Ноя 24 08:28:22 PST 2007
Ivan B. Serezhkin пишет:
> Вообщем попробую объяснить как я решаю такие задачи:
> Поиск в ширину,
> my @queue=qw(list of neighbors);
> while (@queue) {
> my $element=shift @queue;
> last if $element->distance > $deepnes;
> push @queue, map {$_->distance($element->distance()+1);$_} grep {!
> $_->marked()} $element->neighbors();
> $element->mark();
> }
> Эта штука позволяет потрогать все близкие точки на глубину $deepnes
> и расставит им расстояние от начального.
> Но не позволяет найти путь.
>
А у нас нет расстояния от начального элемента. Мы еще не знаем в каком
узле живёт тот или иной адрес.
> Путь ищется перебором в глубину,
> my @queue=($begin_of_path);
> my @path=();
> my $element;
> while (@queue) {
> my $element=pop @queue;
> push @path, $element;
> last if $element==$end_of_path;
> if ($element->neighbors() -1) {
> shift @queue, $element->neighbors();
> } else {
> $element->mark_deleted;
> }
> }
> print "Path: " . join(' - ', grep {!$_->deleted} @path);
> Соответственно neighbors ищется без учёта deleted
> Таким образом, узел у которого отрезали все тупики сам становится тупиком
>
это понятно, проблем с определением тупика нет. Ибо если в узле всего
один порт где присутствует больше
чем 1 устройство, значит этот узел конечный, и этот порт является
downlinkом для узла расположенного выше по иерархии.
Проблема с определением портов в обоих узлах которые являются точками
входа-выхода, ибо скажем центральный узел и все узлы до искомого будут
содержать в своей таблице адреса всех устройств сети, но узел с искомым
устройством может быть не подключен напрямую к центральному узлу.
Подробная информация о списке рассылки Moscow-pm