Алгоритм k-кластерной оптимизации для задачи Штейнера на ориентированных графах

Сер. 10. 2011. Вып. 2

ВЕСТНИК САНКТ-ПЕТЕРБУРГСКОГО УНИВЕРСИТЕТА

УДК 519.176 Д. А. Ейбоженко

АЛГОРИТМ ^-КЛАСТЕРНОЙ ОПТИМИЗАЦИИ

ДЛЯ ЗАДАЧИ ШТЕЙНЕРА НА ОРИЕНТИРОВАННЫХ ГРАФАХ

1. Введение. В любой задаче Штейнера, независимо от конкретной формулировки: на евклидовой плоскости или в более общей, графовой, форме, требуется найти кратчайшую сеть, связывающую заданное множество вершин, имея возможность использовать промежуточные вершины.

Задача Штейнера является фундаментальной задачей в проектировании сверхбольших интегральных схем (Very Large Scale Integration, VLSI). Хотя развитие производства VLSI-плат порождает новые условия на получающиеся пути, но до сих пор именно минимальная длина продолжает оставаться в этом приложении главной целью при прокладке сетей. Для упрощения проектирования и производства VLSI-соединение ограничивается небольшим числом направлений. До недавнего времени проектировщики пользовались манхэттенской метрикой, что вызывало интерес к задаче Штейнера на плоскости с такой метрикой, однако сейчас все более привлекательными становятся неманхэттенские метрики - Y-архитектура (позволяющая углы 0, 120 и 240°), а также X-архитектура (позволяющая углы в 45° в дополнение к манхэттенским).

В последнее время растет интерес к практическим методам вычисления субопти-мальных деревьев Штейнера для задач размером в десятки тысяч терминалов. Задачи такого рода становятся обычными в современном VLSI-проектировании.

Задача Штейнера применяется также в программируемых пользователем логических матрицах (Field-Programmable Gate Arrays, FPGA) [1]. Они представляют собой многократно используемые прикладные интегральные схемы, конфигурацию которых пользователь может достаточно легко изменить. Есть несколько доступных технологий FPGA, но чаще всего они состоят из симметричной матрицы реконфигурируемых логических блоков.

Кроме того, задача находит применение в проектировании телекоммуникационных сетей и восстановлении филогенетических деревьев в биологии [2].

Как известно из [3], задача Штейнера на графах является NP-полной, поэтому большинство попыток ее решения - это эвристики, основанные на разных парадигмах, таких как улучшение минимального остовного дерева, вычислительная геометрия, итеративное улучшение. Отметим, что существует и иногда полезен точный алгоритм, который может быть использован для решения задач малых размерностей.

2. Постановка задачи. Будем рассматривать задачу Штейнера на ориентированном графе. Напомним, что ориентированный граф определяется множеством

Ейбоженко Дмитрий Анатольевич — аспирант кафедры исследования операций математикомеханического факультета Санкт-Петербургского государственного университета. Научный руководитель: доктор физико-математических наук, проф. И. В. Романовский. Количество опубликованных работ: 2. Научное направление: дискретная оптимизация. E-mail: dmitry.meroving@gmail.com.

© Д.А. Ейбоженко, 2011

вершин M и множеством дуг N, причем каждой дуге j Є N сопоставляется упорядоченная пара вершин, называемых соответственно началом и концом этой дуги, beg j и end j .

Если задано некоторое подмножество вершин M/ С M, положим N(M/) = {j Є N : beg j, end j Є M/}. Граф G(M/,N(M/)) будет называться графом, ограниченным множеством M/.

Задача Штейнера на ориентированном графе незначительно отличается от задачи на сетях.

Пусть G(M, N) - ориентированный граф с заданной на дугах функцией d : N ^ R+.

В множестве M выделена вершина b, называемая началом, и множество вершин E, называемых конечными или терминалами.

Любое ориентированное дерево в графе G, с корнем в b и содержащее пути от b до любого терминала из E, называется деревом Штейнера.

Длиной графа называется сумма длин всех его дуг: d(G) = ^neN d(n).

Задача Штейнера на графах состоит в поиске минимального дерева Штейнера, т. е. дерева Штейнера наименьшей длины.

Назовем вершину в ориентированном дереве вершиной разветвления, если из нее выходит не менее двух дуг.

Введем следующие обозначения. Для произвольного графа Г обозначим через M(Г) множество вершин этого графа, через т(Г) = |M (Г)| - их количество, через N (Г) -множество дуг, через п(Г) - их количество. Для некоторой поставленной на графе Г задачи Штейнера обозначим через E^) множество терминалов, через Ь(Г) - начальную вершину.

Пусть T - некоторое дерево. Тогда для любых вершин x,y Є T будем обозначать через P [x, y] путь от x до y, если он существует.

3. Алгоритм нахождения точного решения. Для задачи Штейнера на графах известен точный алгоритм решения, основанный на принципе динамического программирования и уравнении Беллмана. Задача Штейнера решается одновременно для любых начальных вершин т Є M и любых возможных подмножеств Ep С E.

Именно этот алгоритм будет использоваться для вычислений частичных поддеревьев в изложенном ниже алгоритме ^-кластерной оптимизации, поэтому опишем его подробнее [4].

Принципиально алгоритм выглядит следующим образом. Будем обозначать через (i,Ep) состояние процесса, при котором решается задача Штейнера для начальной точки i и множества терминалов Ep, а через v(i,Ep) - решение этой задачи, т. е. длину минимального дерева Штейнера. Нас интересует состояние процесса (b, E).

Пусть процесс находится в состоянии (i,Ep). Считаем что i Є Ep.

В этом состоянии можно выбрать следующие решения:

• Перейти по какой-либо дуге, начинающейся в i, в другую вершину, скажем, ii, и решать задачу (i1, Ep).

• Разветвить путь, выбрав разбиение терминального множества Ep = и k Epk,

и для каждого состояния (i, Epk) решить такую же задачу.

Таким образом, получаем уравнение Беллмана

v

где vcont - наименьшие затраты при наилучшем переходе по какой-либо дуге

vcont

зо

а "Ура!^ - наименьшие затраты при наилучшем разбиении терминального множества Ер на два подмножества А и Ер \ А

Урап

При этом, если Ер состоит из одной вершины, то дерево Штейнера для состояния (і, Ер) - это кратчайший путь, который можно вычислить по алгоритму Дейкстры.

Технически алгоритм реализуется следующим образом.

Имеется таблица размером \М\ х 2|Е|, где в ячейке [і,і] хранится текущая длина графа, соединяющего вершину і Є М с вершинами і-го подмножества Е, т. е. у

Выполняется цикл по подмножествам Е, причем на і-й итерации рассчитываются по методу Дейкстры все длины деревьев для і-го подмножества. Мы имеем ввиду несколько измененный метод Дейкстры: в нем учитывается, что есть вершины из М, для которых уже вычислены промежуточные значения длины. Они помещаются в множество просматриваемых с имеющейся текущей длиной (см. алгоритм Дейкстры).

Далее, для всех уже посчитанных подмножеств (іо < і), таких что Еі0 П Еі = 0, рассматривается подмножество Еі1 = Еі и Еі0 , и для каждой вершины і значение соответствующей ячейки [іі,і], т. е. у(і, Еі1 ), пересчитывается по формуле

у

В результате работы алгоритма в ячейке с номером [Ь, 2ІЕІ] будет содержаться длина искомого минимального дерева Штейнера. Для того чтобы найти само дерево, достаточно иметь еще одну таблицу такого же размера, в которой будут храниться входящие в каждую вершину дуги, найденные алгоритмом Дейкстры.

4. Алгоритм ^-кластерной оптимизации. Общая идея алгоритма состоит в том, чтобы разбить граф на некоторое количество подграфов, в каждый из которых попадает не слишком большое число терминалов, и на каждом из них построить дерево Штейнера до содержащихся в них терминалов точным методом. Затем, преобразовав исходный граф с учетом найденных частичных поддеревьев, с помощью точного метода получить промежуточное решение. Наконец, на последнем шаге с помощью локальных улучшений оптимизировать построенное дерево Штейнера.

Будем рассматривать ход работы алгоритма на примере задачи, приведенной на рис. 1 (выберем для примера к = 11).

4-1- Определение кластеров в графе. Для этого необходимо знать расстояния от начальной вершины Ь до всех вершин в графе. Воспользуемся алгоритмом Дейкстры.

Прежде чем искать кластеры на графе О, построим опорное дерево, ветвлением которого будем руководствоваться при определении кластеров.

4.1.1. Построение опорного дерева. Для построения опорного дерева воспользуемся алгоритмом нахождения приближенного минимального дерева Штейнера на графах, предложенным Такахаши и Мацуямой [5], обобщив его на ориентированные графы. Он выглядит следующим образом:

1. В любой момент процесса построения имеем подграф Тз = (М*, Ы*), первоначально

состоящий из единственной вершины Ь. М* = {Ь}, Ы* = 0.

2. На каждом шаге найдем такую вершину е* Є Е \ М*, что

<1(М*, е*) = шіпЩМ*, е)\е Є Е \ М*}.

Рис. 1. Пример задачи: постановка

Тогда Тз := Тз и Р[М*, в*], где Р[М*, в*] - наименьший из всех возможных путей от вершин М* до в*.

В результате работы алгоритма получим некоторое дерево Штейнера. Способ его ветвления несет в себе информацию, необходимую для разбиения графа на кластеры. Будем компоновать подходящие ветви в отдельные кластеры, учитывая количество содержащихся в них терминалов.

Пример построенного опорного дерева приведен на рис. 2.

4.1.2. Разбиение на кластеры. В результате выполнения предыдущего алгоритма получится опорное дерево Тз с корнем в Ь. На следующем этапе на основании этого дерева будет постепенно строиться разбиение графа на кластеры. Введем параметр к, задающий максимальное число терминалов в подграфе, к которому может быть применен упомянутый алгоритм динамического программирования.

Каждый шаг алгоритма выглядит следующим образом:

1. Найдем в дереве Тз самую дальнюю от Ь вершину разветвления Ь*. Если такой нет, то все дерево считаем одним кластером.

2. Определим количество терминалов в ограниченном данной вершиной поддереве Ть*. Если их больше, чем \Е\/к, то создадим кластер как подграф О, ограниченный на множестве вершин М(Ть*). Отделяем Ть* от исходного дерева: Тз ^ Тз \ Ть*.

3. Если терминалов в Ть* не больше, чем \Е\/к, то найдем на пути Р[Ь, Ь*] в Тз ближайшую к Ь* вершину разветвления Ьр. Ь* ^ Ьр и переходим к п. 2. Если такой нет, то рассматриваем оставшееся Тз, если в нем содержится хотя бы одна терминальная вершина как отдельный кластер, и заканчиваем алгоритм.

После завершения работы этого алгоритма получим некоторый набор кластеров С. Заметим, что \С\ ^ к. Кроме того, в графе остались нетерминальные вершины,

Рис. 2. Пример задачи: построение опорного дерева

не попавшие ни в один кластер. Распределим их по уже существующим кластерам таким образом:

1. Если множество «свободных» вершин непусто, то возьмем любую вершину т.

2. Будем строить дерево кратчайших путей до т с помощью алгоритма Дейкстры до тех пор, пока не найдем кратчайший путь от вершины, содержащейся в некотором кластере. Обозначим эту вершину т*, а кластер, содержащий ее, - С*.

3. Добавим все вершины, содержащиеся в пути Р[т*,т], к кластеру С* и удалим их из множества «свободных». Перейдем к п. 1.

Для рассматриваемого примера набор подграфов представлен на рис. 3.

4-2. Построение деревьев Штейнера на кластерах. На каждом из кластеров С Є С определим индуцированную задачу Штейнера следующим образом: индуцированное множество терминалов Е(С) = Е П М(С), начальная вершина Ь(С) - вершина разветвления, на основании которой был построен кластер С. Если \Е(С)\ ^ к, то решаем поставленную задачу на подграфе точным методом, описанным в п. 4.1, иначе вновь разбиваем полученный подграф на кластеры.

4-3. Улучшение деревьев Штейнера на кластерах. Найдем в построенном на кластере С ЄС дереве Штейнера ближайшую к Ь(С) вершину, являющуюся терминальной или вершиной разветвления - у. Тогда можно выбросить из дерева Штейнера весь путь Р[Ь(С),у], и считать у корневой вершиной данного дерева. В результате таких улучшений набор минимальных деревьев Штейнера примет вид, изображенный на рис. 4.

4.4. Нахождение промежуточного полного дерева Штейнера. Преобразуем исходный граф О следующим образом:

Рис. 4. Пример задачи: улучшенные минимальные деревья Штейнера на подграфах

1. Просматриваем все кластеры, и для каждого кластера C £С удаляем все дуги в G, которые ведут из M \ M(C) в M(C) \ {6(C)} (т. е. все, ведущие извне в любую вершину подграфа, кроме начальной).

2. Всем дугам, которые входят в построенные на кластерах минимальные деревья Штейнера, присваиваем нулевую длину.

3. Будем рассматривать множество начальных вершин подграфов как множество терминалов преобразованного графа. Обозначим {b(C)\C £ C} через E*. Тогда \E*\ = \C\ < к.

После этого на преобразованном графе решаем задачу Штейнера методом динамического программирования.

4-5. Улучшение промежуточного дерева Штейнера. После нахождения промежуточного решения задачи применим к нему метод локальных улучшений:

1. Выделим в S множество Y, состоящее из всех точек ветвления и всех терминалов.

2. Пока Y = 0, возьмем самую дальнюю от b вершину у £ Y и рассмотрим все выходящие из нее ветви. Для каждой ветви сделаем следующее:

(а) Найдем ближайшую к у точку, которая является либо терминалом, либо другой точкой ветвления - у* £ Y.

(б) Выбросим из дерева весь путь от у до у*: S = S \ P[у,у*]. При этом S распадается на две компоненты связности, причем y* и b лежат в разных компонентах связности.

(в) Применим к у* метод Дейкстры - будем строить дерево кратчайших путей до тех пор, пока не построим минимальный путь до нее от некоторой вершины, лежащей в одной компоненте связности с b. Если длина пути между найденной вершиной у** и у* меньше, чем длина пути между у и у*, то добавим P[у**,у*] к дереву. При этом получим новое дерево Штейнера меньшей длины.

3. Выбросим у из Y.

В результате локальных улучшений получаем дерево Штейнера, изображенное на рис. 5.

5. Вычислительные результаты. Найдем вычислительную сложность представленного алгоритма. Пусть m = \M\ - число вершин графа, n = ^\ - число его дуг, t = \E\ - число терминалов. Обозначим множество всех возможных кластеров в G для построенного опорного дерева TS через C.

Лемма 1. Вычислительная сложность алгоритма построения опорного дерева равна O(tn log m).

Доказательство. Поскольку время работы алгоритма Дейкстры равно O(n log m) (при условии использования биномиальной кучи) и для построения опорного дерева его надо использовать t раз, то сложность алгоритма равна O(tn log m).

Лемма 2. Опорное дерево TS графа G, ограниченное на любой построенный с его помощью кластер G, тождественно опорному дереву T'S, построенному на G.

Доказательств о. Прежде всего отметим, что если G' - кластер, построенный в графе G с помощью опорного дерева Ts , значит, существует вершина разветвления b' £ Ts, по которой он был построен и которая является начальной вершиной задачи Штейнера на G'. Множество терминалов в G' : Ea> = E П G'. Пусть в процессе построения опорного дерева Ts на G вершины из Eg> выбираются в следующем порядке: ei, в2,.... Отметим, что путь от ei присоединяется к дереву в вершине b', а все остальные присоединяются в вершинах, принадлежащих G'. Согласно алгоритму, при построении

Рис. 5. Пример задачи: окончательное решение

дерева Т' на О' первым должен выбираться терминал, ближайший к Ь'. Очевидно, это в1, так как иначе при построении дерева Тз на шаге, на котором был выбран в1, вместо него должен был быть выбран другой терминал. Далее, так как путь между в1 и Ь' строится одним и тем же алгоритмом Дейкстры, в обоих случаях он одинаков. Аналогично, следующей будет выбрана вершина в2, которая присоединится к пути (в1,Ь') в той же вершине, что и в дереве Тз (так как по построению дерева Тз это минимальный путь от всех оставшихся вершин из Ео> до пути (в1,Ь')). Продолжая таким образом, получим, что дерево Т ' совпадет с Тз П О'.

Лемма 3. Пусть в опорном дереве Тз графа О есть две точки разветвления Ь1 и Ь2, причем Ь1 и Ь2 лежат на одном пути от Ь к некоторому листу Тз, и Ь1 располагается к корню ближе, чем Ь2 (другими словами, существует путь Р(Ь1: Ь2)), тогда кластер, индуцированный Ь2, будет подграфом кластера, индуцированного Ь1.

Доказательство. Рассмотрим в опорном дереве Тз поддеревья Ть1 и Ть2, ограниченные соответственно вершинами Ь1 и Ь2. Докажем, что М (Ть2) С М (Ть1). По построению ограниченных деревьев, вершина т содержится в ограниченном вершиной Ь дереве, если в Тз существует путь Р(Ь,т). Таким образом, Ут € М(Ть2) ЭР(Ь2,т), а по условию леммы ЭР(Ь1, Ь2), отсюда значит, и ЭР(Ь1,т), т. е. т € М(Ть1). Тогда, по построению, кластер, индуцированный Ь2, является подграфом кластера, индуцированного Ь1 .

Лемма 4. Пусть О' € С - некоторый кластер на О. Тогда С(О') С С.

Доказательств о. По лемме 2 опорное дерево на О' совпадает с опорным деревом Тз исходного графа О, ограниченным на О', поэтому набор точек разветвления на О' у них также совпадает. Обозначим его В. Тогда Ь' = Ь(О') € В. Таким образом, кластер, индуцированный некоторым Ь € В в О', является подграфом кластера, индуцированного Ь в О.

Однако, поскольку yb є B 3P(b/,b), то, согласно лемме З, любой кластер, индуцированный b Є B в G, является подграфом кластера, индуцированного b/, т. е. G/, а значит, кластеры, индуцированные вершинами из B в G/, совпадают с кластерами, индуцированными в G.

Лемма 5. Вычислительная сложность нахождения промежуточного дерева Штейнера в алгоритме кластерной оптимизации равна O(2ktn log m).

Доказательство.Прежде всего отметим, что, поскольку, согласно алгоритму построения опорного дерева, его листьями могут стать только терминалы, то в нем не более t листьев. Для произвольного дерева число точек разветвления строго меньше числа листьев, а значит, число точек разветвления не больше t.

Поскольку, согласно алгоритму, каждый рассматриваемый кластер строится на основании некоторой точки разветвления в опорном дереве и на основе одной точки разветвления может быть построен только один кластер, то число возможных кластеров в графе также не превосходит t (|C| = t).

Для нахождения всех точек разветвления на опорном дереве требуется однократный проход по всем вершинам дерева, т. е. O(m).

Количество терминалов в кластере, индуцированном вершиной разветвления b, равно количеству терминалов в поддереве опорного дерева T , ограниченного b. Алгоритм для подсчета количества терминалов в кластере основан на хранении информации об уже подсчитанных кластерах. Для подсчета количества терминалов в кластере, индуцированном b, будем идти по каждой из ветвей и добавлять вершины в некоторое просматриваемое множество до тех пор, пока не дойдем до другой вершины разветвления b/. Согласно алгоритму, количество терминалов в поддереве, ограниченном b/, уже известно, следовательно, остается подсчитать только число терминалов в просматриваемом множестве. Таким образом, ни одна вершина в графе не будет просмотрена более одного раза, а значит, всего надо проверить m вершин на вхождение в множество терминалов T. Проверка вхождения одной вершины в множество терминалов при соответствующей организации занимает O(logt), таким образом всего для нахождения количества терминалов во всех кластерах требуется O(m log t).

Обратимся к алгоритму. На первом этапе в исходном графе выделяется не более к кластеров, при этом каждый терминал попадает в какой-то кластер. Если в некоторый кластер G/ попало более к терминалов, то для решения подзадачи Штейнера на нем вновь применяется кластерный метод, что подразумевает его разбиение на более мелкие кластеры. Как доказано в лемме 4, множество всех возможных кластеров кластера G/ также находится в C, а значит, и его разбиение содержится в C. Следовательно, разбиение графа на кластеры можно представить деревом, каждая вершина которого отвечает некоторому кластеру из C (корень соответствует всему графу). В этом дереве для любой вершины множество ее детей представляет разбиение кластера, ей соответствующего, на более мелкие кластеры. Тогда листья данного дерева - это кластеры, содержащие не более к терминалов, и у каждой вершины не может быть более к детей. Кроме того, как уже показано выше, все вершины дерева соответствуют некоторым кластерам из C, а значит, всего в дереве не более t вершин.

Согласно алгоритму, на кластерах, отвечающих листьям дерева, применяется точный метод на к-ограниченном графе. Далее, имея построенные деревья на всех кластерах разбиения некоторого графа, можно найти приближенное дерево Штейнера на нем, также применив точный метод Штейнера, первоначально преобразовав его, как описано в алгоритме (данный граф по построению тоже является к-ограниченным).

Следовательно, для того чтобы получить приближенное дерево Штейнера исходного графа, потребуется применить точный метод на к-ограниченном графе столько раз, сколько вершин в дереве кластеров, а их, как мы уже показали, не более t. Как известно из [6], сложность метода Дейкстры с очередью, организованной в виде биномиального дерева, равна O

Лемма 6. Вычислительная сложность алгоритма локальных улучшений равна O(tn log m).

Доказательство. Общее количество терминалов и точек разветвления в промежуточном дереве Штейнера не превосходит 2t. Поиск пути для отцепления требует O(m) времени, так как осуществляется однократным проходом по дереву, в котором не более m дуг. Нахождение нового пути с помощью алгоритма Дейкстры требует O(n log m), отсюда общее время работы метода составляет O(tn log m).

Теорема. Вычислительная сложность алгоритма кластерной оптимизации равна O(2ktn log m).

Доказательство. Сложив вычислительные сложности всех алгоритмов получим O(tn log m + 2ktn log m + tn log m). Убрав из выражения все доминируемые слагаемые, имеем O(2ktn log m). Необходимо отметить, что в научных работах наиболее освещены евклидова, прямоугольная и сетевая задачи Штейнера. Задача Штейнера на ориентированных графах исследована значительно меньше, благодаря чему практически не обладает экспериментальной базой, а также имеет значительно меньше известных методов решения. Вследствие этого для проведения экспериментов использовалась база задач Штейнера в сетях (400 задач с числом терминалов от 8 до І60), которые приводились к задачам Штейнера на ориентированных графах заменой каждого ребра на две разнонаправленные дуги, а также выбором из множества терминальных вершин случайной, задававшейся начальной. Эксперименты проводились при к = 11. Алгоритм к-кластерной оптимизации сравнивался с:

1) модификацией для ориентированных графов алгоритма Такахаши [5], которым мы строили опорное дерево в алгоритме к-кластерной оптимизации;

2) алгоритмом ІІ/6-аппроксимации для неориентированных графов, представленный А. Зеликовским в І992 г. [7], основанном на «жадном» добавлении к дереву звезд, созданных из троек терминалов, соединенных вершиной не из множества терминалов.

В сравнение должен был войти также приближенный алгоритм для ориентированных графов из [8], однако его практическая реализация оказалась слишком требовательной к процессорному времени, и от нее было решено отказаться.

Результат сравнения приведен на рис. 6. По оси абсцисс графика отложено число терминалов, по оси абсцисс - среднее значение относительной потери в целевой функции в сравнении с точным минимумом для задач с данным числом терминалов. Можно заметить, что на экспериментальных данных алгоритм к-кластерной оптимизации оказался значительно эффективнее двух других сравниваемых алгоритмов, несмотря даже на то, что сравнение проводилось на суженном относительно области применения представленного алгоритма круге задач. Однако на данный момент существуют и более эффективные алгоритмы для решения задач в сетях, чем рассмотренные на рис. 6.

6. Заключение. В данной работе был разработан эвристический алгоритм к-кластерной оптимизации для решения задачи Штейнера на ориентированных

Рис. 6. Сравнение алгоритмов ^-кластерной оптимизации

графах. Доказана теорема о вычислительной сложности алгоритма. Несмотря на отсутствие в настоящий момент доказанной верхней оценки коэффициента аппроксимации, на экспериментальных данных алгоритм продемонстрировал конкурентоспособную эффективность, в том числе на специальных типах задач (неориентированных графах).

Литература

1. Alexander M. J., Robins G. New Perfomance-Driven FPGA Routing Algorithms // Proc. of the 32nd annual ACM/IEEE Design Automation Conference. 1996. P. 562—567.

2. Chin L. L., Chuan Y. T., Lee R. The Full Steiner Tree Problem in Phylogeny // Computing and Combinatorics. 2002. P. 107—116.

3. Гэри М., Джонсон Д. Вычислительные машины и труднорешаемые задачи / пер. с англ. Е. В. Левнера, М. А. Фрумкина; под ред. А. А. Фридмана. М.: Мир, 1982. 416 с.

4. Романовский И. В. Дискретный анализ. СПб.: Невский Диалект, 2003. 320 с.

5. Takahashi H., Matsuyama A. An Approximate Solution for the Steiner Problem in Graphs // Math. Japonica. 1980. Vol. 24, N 6. P. 573-577.

6. Корман Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы. Построение и анализ / пер. с англ.; под ред. А. Шеня. М.: Вильямс, 2005. 1293 с.

7. Zelikovsky A. 11/6-approximation algorithm for the Steiner problem on graphs // Proc. Fourth Czechoslovakian Symposium on Combinatorics, Graphs, and Complexity. 1992. P. 351-354.

8. Charikar M. Approximation Algorithms for Directed Steiner Problems // J. of Algorithms. 1999. Vol. 33, N 1. P. 73-91.

Статья рекомендована к печати проф. Л. А. Петросяном. Статья принята к печати 16 декабря 2010 г.