Алгоритм принимает в качестве входных данных направленный граф, где — набор узлов, а — набор направленных ребер, выделенную вершину, называемую корнем , и действительный вес для каждого ребра . Он возвращает охватывающее древовидное дерево с корнем в точке минимального веса, где вес древовидного дерева определяется как сумма весов его ребер, .
Алгоритм имеет рекурсивное описание. Пусть обозначает функцию, которая возвращает связующее дерево с корнем в минимальном весе. Сначала мы удаляем любое ребро, из которого назначением является . Мы также можем заменить любой набор параллельных ребер (ребра между одной и той же парой вершин в одном направлении) одним ребром с весом, равным минимуму из весов этих параллельных ребер.
Теперь для каждого узла, отличного от корня, найдите ребро, входящее в наименьшего веса (с произвольно разорванными связями). Обозначим источник этого ребра через . Если набор ребер не содержит циклов, то .
В противном случае содержит по крайней мере один цикл. Произвольно выберем один из этих циклов и назовем его . Теперь мы определим новый взвешенный ориентированный граф , в котором цикл «сжимается» в один узел следующим образом:
Узлы — это узлы не в плюс новый узел, обозначенный .
Если есть ребро в с и (ребро, входящее в цикл), то включаем в новое ребро и определяем .
Если есть ребро в с и (ребро, выходящее из цикла), то включаем в новое ребро и определяем .
Если есть ребро с и (ребро, не связанное с циклом), то включаем в новое ребро и определяем .
Для каждого ребра в мы запоминаем, какому ребру в нем соответствует.
Теперь найдем минимальное остовное дерево с помощью вызова . Так как является остовным деревом, каждая вершина имеет ровно одно входящее ребро. Пусть будет единственным входящим ребром в в . Это ребро соответствует ребру с . Удалим ребро из , разорвав цикл. Отметим каждое оставшееся ребро в . Для каждого ребра в отметим его соответствующее ребро в . Теперь мы определяем как множество отмеченных ребер, которые образуют минимальное остовное дерево.
Заметьте, что определяется в терминах , имея строго меньше вершин, чем . Нахождение графа с одной вершиной тривиально (он сам по себе), поэтому рекурсивный алгоритм гарантированно завершится.
Продолжительность работы
Время выполнения этого алгоритма составляет . Более быстрая реализация алгоритма, созданная Робертом Тарьяном, работает за время как для разреженных, так и для плотных графов. Это так же быстро, как алгоритм Прима для неориентированного минимального остовного дерева. В 1986 году Габов , Галиль , Спенсер и Тарьяном создали более быструю реализацию со временем выполнения .
Ссылки
^ Алгоритм применим для поиска минимального остовного леса с заданными корнями. Однако при поиске минимального остовного леса среди всех -компонентных остовных лесов в сложности алгоритма возникает множитель , соответствующий выбору подмножества вершин, обозначенных как корни. Это делает его непригодным для такой задачи. Даже при построении минимального остовного дерева, независимо от корня, алгоритм необходимо использовать раз, последовательно назначая каждую вершину в качестве корня. Эффективный алгоритм для поиска минимальных остовных лесов, решающий задачу назначения корней, представлен в (https://link.springer.com/article/10.1007/s10958-023-06666-w). Он строит последовательность минимальных -компонентных остовных лесов для всех вплоть до минимального остовного дерева. Алгоритм Чу-Лю/Эдмондса является его компонентом.
Чу, Ён-Цзинь; Лю, Цэн-Хун ( 1965 ), «О кратчайшем древовидном дереве направленного графа» (PDF) , Scientia Sinica , XIV (10): 1396–1400
Эдмондс, Дж. (1967), «Оптимальные разветвления», Журнал исследований Национального бюро стандартов, раздел B , 71B (4): 233–240 , doi : 10.6028/jres.071b.032
Тарьян, Р. Э. (1977), «Поиск оптимальных ветвлений», Сети , 7 : 25–35 , doi :10.1002/net.3230070103
Камерини, премьер-министр; Фратта, Л.; Маффиоли, Ф. (1979), «Заметки о поиске оптимальных разветвлений», Networks , 9 (4): 309–312 , doi : 10.1002/net.3230090403.
Гиббонс, Алан (1985), Алгоритмическая теория графов , Cambridge University Press, ISBN0-521-28881-9
Габов, Х. Н.; Галил , З .; Спенсер, Т.; Тарьян, Р. Э. (1986), «Эффективные алгоритмы для поиска минимальных остовных деревьев в неориентированных и ориентированных графах», Combinatorica , 6 (2): 109– 122, doi :10.1007/bf02579168, S2CID 35618095
Буслов, В. (2023), «Алгоритм последовательного построения остовных минимальных направленных лесов», Журнал математических наук , 275 : 117–129 , doi : 10.1007/s10958-023-06666-w
Внешние ссылки
Алгоритм Эдмондса (edmonds-alg) – реализация алгоритма Эдмондса, написанная на C++ и лицензированная по лицензии MIT . Этот источник использует реализацию Тарьяна для плотного графа.
NetworkX, библиотека Python , распространяемая под управлением BSD , имеет реализацию алгоритма Эдмондса.
(spanning-forest-builder 0.0.2) – Библиотека для построения ориентированных лесов минимального веса.