1. выбрать вершину
с максимальным весом;
2. проверить смежные с ней вершины из
; вершины с меньшим весом далее не рассматривать;
3. перейти к одной из оставшихся вершин с весами, равными весу исходной вершины; например к вершине
для которой
.
4. проверить смежные с
вершины из
, если все смежные вершины имеют не больший вес т.е.
...
Надо думать, здесь речь идет о вершинах
реберного графа.
Пункт 2 в части "... далее не рассматривать ..." сомнителен. Можно привести примеры, когда они все же участвуют в графе-кандидате.
А в целом, для такого поиска как раз и нужна приоритетная очередь. Очень удобно.
А что по этому поводу скажет уважаемый sup ?
Если я правильно понимаю задачу, то нам дан граф
и требуется описать такие связные подграфы
, что всякое внутреннее ребро подграфа
дороже всякого внешнего.
Я намерен систематически перечислить все такие подграфы.
Сначала, для простоты, предположим, что все веса разные. Это будет, так сказать, главная колея алгоритма.
В каждом искомом подграфе
всегда имеется самое дорогое ребро. Поэтому мы сгруппируем все искомые
по этому ребру. Итак, циклом пробегаем все ребра и находим все
, для которых оно самое дорогое.
Возникла подзадача.
Пусть дано некое ребро. Опишем все подграфы
, для которых это самое дорогое ребро. Для определенности обозначим его как
- ребро между вершинами 0 и 1. Его вес -
.
Рассмотрим семейство
всех ребер, инцидентных вершинам 0 и 1. Если среди них найдется хотя бы одно дороже
- работа закончена. Таких
нет. А если они все меньше? Тогда вот и первый кандидат.
- состоит из единственного ребра
. Дальше. Рассматриваем самое дорогое ребро в семействе
. Оно непременно будет или внутренним или внешним к нашему искомому
. А значит просто обязано быть внутренним. Ну что-ж, добавляем. к нашему ребру
. Пусть для определенности это
и вес -
. Но вместе с ним у нас появляется и внутреннее ребро
с весом
. Проверяем полученный граф на предмет допустимости. Если допустим - в копилку и поехали дальше. А если нет? Это значит, что в семействе
есть ребра дороже
, а значит все они с необходимостью должны быть внутренними. Добавляем их все чохом (а вместе с ними и кучу других "индуцированных" внутренних). И вновь проверяем полученный подграф. Если допустим - в копилку, а если нет, то ... Надеюсь, дальнейшее уже очевидно. Отмечу лишь, что как только мы натыкаемся на ребро дороже
процедура обрывается.
Как лучше всего проводить поиск таких ребер? Такая структура давным-давно известна - приоритетная очередь из алгоритма Прима. Там есть всякие навороты, типа фибоначчиевы кучи и прочие изыски, для которых операция updateKey имеет "хорошую" учетную стоимость. Можно гуглить.
Ну, и несколько слов о том, что делать, когда есть ребра одинаковой стоимости. Да все то же самое. При просмотре инцидентных ребер они все сразу хором и добавляются к текущему подграфу. Однако есть риск несколько раз зарегистрировать один и тот же подграф, начиная с разных ребер одного веса. Здесь надо просто назначить расширенную операцию сравнения, которая при равенстве весов дополнительно сравнивает еще и номера ребер (ну или еще что, лишь бы обеспечить уникальность). При таком подходе каждый подграф будет описан только один раз.