Алгоритм Эдмондса (Glikjnmb |;bku;vg)
Алгоритм Эдмондса или алгоритм Чу — Лью/Эдмондса — это алгоритм поиска остовного ориентированного корневого дерева[англ.] минимального веса для заданного корня (иногда называемого оптимальным ветвлением)[1]. Задача является ориентированным аналогом задачи о минимальном остовном дереве.
Алгоритм предложили независимо сначала Ён-Чин Чу и Чжен-Гон Лью (1965), а затем Джек Эдмондс (1967).
Алгоритм
[править | править код]Описание
[править | править код]Алгоритм принимает входной ориентированный граф , где является набором узлов, а является набором ориентированных рёбер, выделенную вершину , называемую корнем, и вещественные значения весов для каждого ребра . Алгоритм возвращает остовное ориентированное корневое дерево[англ.] минимального веса с корнем в , где вес корневого дерева определяется как сумма весов его рёбер, .
Алгоритм имеет рекурсивное описание. Пусть означает функцию, которая возвращает ориентированное корневое дерево с корнем в минимального веса. Мы сначала удаляем все ребра из , концом которых служит . Мы можем затем заменить любое множество параллельных рёбер (рёбер между одной и той же парой вершин в том же направлении) одним ребром с весом, равным минимальному весу этих параллельных рёбер.
Теперь для каждого узла , отличного от корня, находим ребро, входящее в , с минимальным весом. Обозначим источник этого ребра через . Если множество рёбер не содержит каких-либо циклов, то .
В противном случае содержит по меньшей мере один цикл. Произвольным образом выберем один из этих циклов и назовём его . Мы теперь определяем новый взвешенный ориентированный граф , в котором цикл «стянут» в один узел следующим образом:
Узлы — это узлы , не принадлежащие плюс новый узел, обозначенный как .
- Если является ребром в с и (ребро с концом в цикле), тогда включаем в новое ребро и определяем .
- Если является ребром в с и (ребро с началом в цикле), то включаем в новое ребро и определяем .
- если является ребром в с и (ребро никак не связано с циклом), то включаем в новое ребро и определяем .
Для каждого ребра в мы запоминаем, какому ребру в оно соответствует.
Теперь находим минимальное ориентированное корневое дерево графа путём вызова . Поскольку является ориентированным корневым деревом, каждая вершина имеет в точности одно входящее ребро. Пусть будет единственным входящим ребром в в . Это ребро соответствует ребру с . Удалим ребро из , разрывая цикл. Пометим каждое оставшееся ребро в . Для каждого ребра в пометим его соответствующее ребро в . Теперь мы определим как набор помеченных рёбер, которые образуют минимальное ориентированное корневое дерево.
Заметим, что определена в терминах с , имеющим строго меньшее число вершин, чем у . Нахождение для графа, состоящего из отдельной вершины, тривиально, так что рекурсивный алгоритм гарантированно завершится.
Время работы
[править | править код]Время работы алгоритма — . Более быстрая реализация алгоритма Роберта Тарьяна работает за время на разреженных графах и за время на плотных графах. Это та же скорость, что и у алгоритма Прима для неориентированного минимального остовного дерева. В 1986 Габов, Галиль, Спенсер, Комптон и Тарьян предложили более быструю реализацию со временем работы .
Примечания
[править | править код]- ↑ Алгоритм применим к нахождению минимального остовного леса с заданными корнями. Однако при поиске минимального остовного леса среди всех -компонентных остовных лесов в сложности алгоритма возникает множитель , отвечающий выбору подмножества вершин, назначаемых корнями. Это делает его малопригодным для такой задачи. Даже при построении минимального остовного дерева безотносительно корня алгоритм приходится применять раз, последовательно назначая каждую вершину корнем. Эффективный алгоритм поиска минимальных остовных лесов, решаюший проблему назначения корней, представлен в https://link.springer.com/article/10.1007/s10958-023-06666-w. Он строит последовательность минимальных -компонентных остовных лесов для всех вплоть до остовного минимального дерева. Алгоритм Чу — Лью/Эдмондса является его составной частью.
Литература
[править | править код]- Chu Y. J., Liu T. H. On the Shortest Arborescence of a Directed Graph // Science Sinica. — 1965. — Т. 14. — С. 1396–1400.
- Edmonds J. Optimum Branchings // J. Res. Nat. Bur. Standards. — 1967. — Т. 71B. — С. 233–240. — doi:10.6028/jres.071b.032.
- Tarjan R. E. Finding Optimum Branchings // Networks. — 1977. — Т. 7. — С. 25–35. — doi:10.1002/net.3230070103.
- Camerini P.M., Fratta L., Maffioli F. A note on finding optimum branchings // Networks. — 1979. — Т. 9. — С. 309–312. — doi:10.1002/net.3230090403.
- Alan Gibbons. Algorithmic Graph Theory. — Cambridge University press, 1985. — ISBN 0-521-28881-9.
- Efficient algorithms for finding minimum spanning trees in undirected and directed graphs // Combinatorica. — 1986. — Т. 6. — С. 109–122. — doi:10.1007/bf02579168.
- Buslov V.A. Algorithm for Sequential Construction of Spanning Minimal Directed Forests // Journal of Mathematical Sciences. — 2023. — Т. 275. — С. 117–129. — doi:10.1007/s10958-023-06666-w.
Ссылки
[править | править код]- Edmonds's algorithm ( edmonds-alg ) – реализация алгоритма Эдмондса на C++ с лицензией MIT. Этот источник использует реализацию Тарьяна для плотных графов.
- NetworkX, библиотека python, распространяемая по лицензии BSD, имеет реализацию алгоритма Эдмондса.
- (spanning-forest-builder 0.0.2) – Библиотека для построения ориентированных лесов минимального веса.
Для улучшения этой статьи желательно:
|