1. выбрать вершину
![$v$ $v$](https://dxdy-03.korotkov.co.uk/f/6/c/4/6c4adbc36120d62b98deef2a20d5d30382.png)
с максимальным весом;
2. проверить смежные с ней вершины из
![$N(v)$ $N(v)$](https://dxdy-04.korotkov.co.uk/f/f/9/4/f947b3c602ca948910b99f1601e5abed82.png)
; вершины с меньшим весом далее не рассматривать;
3. перейти к одной из оставшихся вершин с весами, равными весу исходной вершины; например к вершине
![$u \in N(v)$ $u \in N(v)$](https://dxdy-03.korotkov.co.uk/f/a/f/f/affef3500b158dc3df22f69f16db6c2282.png)
для которой
![$w(u) = w(v)$ $w(u) = w(v)$](https://dxdy-04.korotkov.co.uk/f/f/c/c/fcce4b114c4cbc7d757d0605ea3b62cc82.png)
.
4. проверить смежные с
![$u$ $u$](https://dxdy-03.korotkov.co.uk/f/6/d/b/6dbb78540bd76da3f1625782d42d6d1682.png)
вершины из
![$N(u)$ $N(u)$](https://dxdy-03.korotkov.co.uk/f/6/6/7/667a31ccc1902c6c8ee8e43a16c8405582.png)
, если все смежные вершины имеют не больший вес т.е.
...
Надо думать, здесь речь идет о вершинах
реберного графа.
Пункт 2 в части "... далее не рассматривать ..." сомнителен. Можно привести примеры, когда они все же участвуют в графе-кандидате.
А в целом, для такого поиска как раз и нужна приоритетная очередь. Очень удобно.
А что по этому поводу скажет уважаемый sup ?
Если я правильно понимаю задачу, то нам дан граф
![$G$ $G$](https://dxdy-02.korotkov.co.uk/f/5/2/0/5201385589993766eea584cd3aa6fa1382.png)
и требуется описать такие связные подграфы
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
, что всякое внутреннее ребро подграфа
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
дороже всякого внешнего.
Я намерен систематически перечислить все такие подграфы.
Сначала, для простоты, предположим, что все веса разные. Это будет, так сказать, главная колея алгоритма.
В каждом искомом подграфе
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
всегда имеется самое дорогое ребро. Поэтому мы сгруппируем все искомые
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
по этому ребру. Итак, циклом пробегаем все ребра и находим все
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
, для которых оно самое дорогое.
Возникла подзадача.
Пусть дано некое ребро. Опишем все подграфы
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
, для которых это самое дорогое ребро. Для определенности обозначим его как
![$(0,1)$ $(0,1)$](https://dxdy-02.korotkov.co.uk/f/1/e/5/1e5ba49ae6981862f61b4d510dcf29af82.png)
- ребро между вершинами 0 и 1. Его вес -
![$W_0$ $W_0$](https://dxdy-03.korotkov.co.uk/f/e/0/a/e0ab31cb9c791e75fc086f61bfb584f882.png)
.
Рассмотрим семейство
![$K$ $K$](https://dxdy-02.korotkov.co.uk/f/d/6/3/d6328eaebbcd5c358f426dbea4bdbf7082.png)
всех ребер, инцидентных вершинам 0 и 1. Если среди них найдется хотя бы одно дороже
![$W_0$ $W_0$](https://dxdy-03.korotkov.co.uk/f/e/0/a/e0ab31cb9c791e75fc086f61bfb584f882.png)
- работа закончена. Таких
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
нет. А если они все меньше? Тогда вот и первый кандидат.
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
- состоит из единственного ребра
![$(0,1)$ $(0,1)$](https://dxdy-02.korotkov.co.uk/f/1/e/5/1e5ba49ae6981862f61b4d510dcf29af82.png)
. Дальше. Рассматриваем самое дорогое ребро в семействе
![$K$ $K$](https://dxdy-02.korotkov.co.uk/f/d/6/3/d6328eaebbcd5c358f426dbea4bdbf7082.png)
. Оно непременно будет или внутренним или внешним к нашему искомому
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
. А значит просто обязано быть внутренним. Ну что-ж, добавляем. к нашему ребру
![$(0,1)$ $(0,1)$](https://dxdy-02.korotkov.co.uk/f/1/e/5/1e5ba49ae6981862f61b4d510dcf29af82.png)
. Пусть для определенности это
![$(0,2)$ $(0,2)$](https://dxdy-04.korotkov.co.uk/f/3/1/5/3150be8ce1eb3c46516663ffcedc92b182.png)
и вес -
![$W_1$ $W_1$](https://dxdy-01.korotkov.co.uk/f/4/c/0/4c0c82cdc5d7bf2312fe6669d3f632f382.png)
. Но вместе с ним у нас появляется и внутреннее ребро
![$(1,2)$ $(1,2)$](https://dxdy-02.korotkov.co.uk/f/1/c/3/1c394c4b3e3331b224c0f430ee7ccbe782.png)
с весом
![$W_2$ $W_2$](https://dxdy-04.korotkov.co.uk/f/b/f/e/bfe07c5ad920c458cb1d7ffd1303c3c382.png)
. Проверяем полученный граф на предмет допустимости. Если допустим - в копилку и поехали дальше. А если нет? Это значит, что в семействе
![$K$ $K$](https://dxdy-02.korotkov.co.uk/f/d/6/3/d6328eaebbcd5c358f426dbea4bdbf7082.png)
есть ребра дороже
![$W_2$ $W_2$](https://dxdy-04.korotkov.co.uk/f/b/f/e/bfe07c5ad920c458cb1d7ffd1303c3c382.png)
, а значит все они с необходимостью должны быть внутренними. Добавляем их все чохом (а вместе с ними и кучу других "индуцированных" внутренних). И вновь проверяем полученный подграф. Если допустим - в копилку, а если нет, то ... Надеюсь, дальнейшее уже очевидно. Отмечу лишь, что как только мы натыкаемся на ребро дороже
![$W_0$ $W_0$](https://dxdy-03.korotkov.co.uk/f/e/0/a/e0ab31cb9c791e75fc086f61bfb584f882.png)
процедура обрывается.
Как лучше всего проводить поиск таких ребер? Такая структура давным-давно известна - приоритетная очередь из алгоритма Прима. Там есть всякие навороты, типа фибоначчиевы кучи и прочие изыски, для которых операция updateKey имеет "хорошую" учетную стоимость. Можно гуглить.
Ну, и несколько слов о том, что делать, когда есть ребра одинаковой стоимости. Да все то же самое. При просмотре инцидентных ребер они все сразу хором и добавляются к текущему подграфу. Однако есть риск несколько раз зарегистрировать один и тот же подграф, начиная с разных ребер одного веса. Здесь надо просто назначить расширенную операцию сравнения, которая при равенстве весов дополнительно сравнивает еще и номера ребер (ну или еще что, лишь бы обеспечить уникальность). При таком подходе каждый подграф будет описан только один раз.