Алгоритм Эдмондса
В графов теории алгоритм Эдмондса или алгоритм Чу-Лю/Эдмондса — это алгоритм поиска остовного древообразного дерева минимального веса (иногда называемого оптимальным ветвлением ). Это направленный аналог задачи о минимальном остовном дереве . Алгоритм был предложен независимо сначала Йонг-Джином Чу и Ценг-Хонг Лю (1965), а затем Джеком Эдмондсом (1967).
Алгоритм
[ редактировать ]Описание
[ редактировать ]Алгоритм принимает на вход ориентированный граф. где представляет собой набор узлов и — множество направленных ребер, выделенная вершина называется корнем и действительным весом для каждого края . Возвращает охватывающее древовидение укоренен в минимального веса, где вес древостоя определяется как сумма весов его ребер, .
Алгоритм имеет рекурсивное описание. Позволять обозначают функцию, которая возвращает остовное дерево с корнем в минимального веса. Сначала мы удаляем все края чей пункт назначения . Мы также можем заменить любой набор параллельных ребер (ребер между одной и той же парой вершин в одном направлении) одним ребром с весом, равным минимуму весов этих параллельных ребер.
Теперь для каждого узла кроме корня, найдите ребро, входящее в наименьшего веса (с произвольным разрывом связей). Обозначим источник этого ребра через . Если множество ребер не содержит циклов, то .
В противном случае, содержит хотя бы один цикл. Произвольно выберем один из этих циклов и назовем его . Теперь мы определяем новый взвешенный ориентированный граф. в котором цикл «сжимается» в один узел следующим образом:
Узлы являются узлами не в плюс новый узел, обозначенный .
- Если является преимуществом в с и (ребро, входящее в цикл), затем включить в новый край и определить .
- Если является преимуществом в с и (ребро, выходящее из цикла), затем включить в новый край и определить .
- Если является преимуществом в с и (ребро, не связанное с циклом), затем включить в новый край и определить .
Для каждого ребра в , мы запоминаем, какое ребро в это соответствует.
Теперь найдите минимальную протяженность древовидности. из используя вызов . С представляет собой связующее дерево, каждая вершина имеет ровно одно входящее ребро. Позволять быть уникальным входящим преимуществом для в . Это ребро соответствует ребру с . Удалить край от , разрывая цикл. Отметьте каждый оставшийся край в . Для каждого ребра в , отметьте соответствующее ему ребро в . Теперь мы определяем быть набором отмеченных ребер, которые образуют минимальное ветвящееся древо.
Обратите внимание, что определяется с точки зрения , с имеющий строго меньше вершин, чем . Нахождение для одновершинного графа тривиально (это просто сам), поэтому рекурсивный алгоритм гарантированно завершится.
Время работы
[ редактировать ]Время работы этого алгоритма . Более быстрая реализация алгоритма благодаря Роберту Тарьяну выполняется вовремя. для разреженных графов и для плотных графов. Это так же быстро, как алгоритм Прима для неориентированного минимального остовного дерева. В 1986 году Габоу , Галил , Спенсер и Тарьян создали более быструю реализацию с меньшим временем выполнения. .
Ссылки
[ редактировать ]- Чу, Ён Джин; Лю, Ценг-Хонг (1965), «О кратчайшем древовидении ориентированного графа» (PDF) , Scientia Sinica: Chung-kuo k`o hsueh , XIV (10): 1396–1400
- Эдмондс, Дж. (1967), «Оптимальные разветвления», Журнал исследований Национального бюро стандартов, раздел B , 71B (4): 233–240, doi : 10.6028/jres.071b.032
- Тарьян, Р.Э. (1977), «Нахождение оптимальных ветвей», Networks , 7 : 25–35, doi : 10.1002/net.3230070103
- Камерини, премьер-министр; Фратта, Л.; Маффиоли, Ф. (1979), «Заметки о поиске оптимальных разветвлений», Networks , 9 (4): 309–312, doi : 10.1002/net.3230090403
- Гиббонс, Алан (1985), Алгоритмическая теория графов , издательство Кембриджского университета, ISBN 0-521-28881-9
- Габоу, Гонконг ; Галил, З. ; Спенсер, Т.; Тарьян, Р.Э. (1986), «Эффективные алгоритмы поиска минимальных остовных деревьев в неориентированных и ориентированных графах», Combinatorica , 6 (2): 109–122, doi : 10.1007/bf02579168 , S2CID 35618095
Внешние ссылки
[ редактировать ]- Алгоритм Эдмондса ( edmonds-alg ) — реализация алгоритма Эдмондса, написанная на C++ и лицензированная по лицензии MIT . Этот источник использует реализацию Tarjan для плотного графа.
- NetworkX, библиотека Python , распространяемая под BSD , имеет реализацию алгоритма Эдмондса .