Для ориентированного взвешенного графа требуется минимальный набор рёбер, обеспечивающий достижимость всех вершин от фиксированного источника при минимальной сумме весов — сформулируйте задачу формально, разъясните связь с задачей о минимальном арборесценции (Edmonds’ algorithm), опишите алгоритм и проиллюстрируйте на небольшом примере
Формулировка задачи - Дано ориентированный взвешенный граф (V,E)(V,E)(V,E), функция весов w:E→R \;w:E\to\mathbb{R}\;w:E→R и фиксированный источник (корень) r∈V\;r\in Vr∈V. - Требуется найти подмножество рёбер A⊆EA\subseteq EA⊆E такое, что в ориентированном графе (V,A)(V,A)(V,A) из корня r \;r\;r достижимы все вершины, и суммарный вес ∑e∈Aw(e)\sum_{e\in A} w(e)∑e∈Aw(e) минимален. - Эквивалентное формальное требование: найти минимальную по сумме весов ориентированную остовную арборесценцию (directed spanning arborescence) корня r\;rr — то есть такое подмножество AAA, что ∀v∈V∖{r} : indegA(v)=1,indegA(r)=0,
\forall v\in V\setminus\{r\}\;:\;\ indeg_A(v)=1,\qquad indeg_A(r)=0, ∀v∈V∖{r}:indegA(v)=1,indegA(r)=0,
и (V,A)(V,A)(V,A) ацикличен (тогда из rrr есть путь в любую вершину). Цель: минимизировать w(A)=∑e∈Aw(e)\;w(A)=\sum_{e\in A} w(e)w(A)=∑e∈Aw(e). Связь с задачей о минимальной арборесценции (Edmonds / Chu–Liu) - Это именно задача минимальной (корневой) арборесценции. Алгоритм Chu–Liu/Edmonds даёт полиномиальное решение: выбирает для каждой вершины минимальное входящее ребро, обнаруживает и сворачивает циклы, корректирует веса и рекурсивно решает задачу на сжатом графе, затем разворачивает циклы, восстанавливая решение. Алгоритм (Chu–Liu/Edmonds), суть и формулы 1. Для каждой вершины v≠r \;v\neq r\;v=r выбираем входящее ребро с минимальным весом: ev=argmin(u→v)∈Ew(u→v).
e_v=\arg\min_{(u\to v)\in E} w(u\to v). ev=arg(u→v)∈Eminw(u→v).
Если такие выбранные ребра образуют ацикличный граф, то набор {ev}v≠r\{e_v\}_{v\neq r}{ev}v=r — искомая минимальная арборесценция. 2. Если выбранные ребра содержат цикл(ы), то возьмём любой цикл CCC. Свернём вершины цикла в одну супер-вершину c \;c\;c. Построим сжатый граф G′G'G′ так: - Для ребра (x→y)(x\to y)(x→y) с x∉C, y∉Cx\notin C,\,y\notin Cx∈/C,y∈/C сохраняем без изменений. - Для ребра (x→y)(x\to y)(x→y) с x∉C, y∈Cx\notin C,\,y\in Cx∈/C,y∈C вводим ребро (x→c)(x\to c)(x→c) с весом w′(x→c)=w(x→y)−w(ey),
w'(x\to c)=w(x\to y)-w(e_y), w′(x→c)=w(x→y)−w(ey),
где eye_yey — выбранное минимальное входящее ребро в yyy на шаге 1. - Для ребра (x→y)(x\to y)(x→y) с x∈C, y∉Cx\in C,\,y\notin Cx∈C,y∈/C вводим ребро (c→y)(c\to y)(c→y) с весом w′(c→y)=minx∈Cw(x→y),
w'(c\to y)=\min_{x\in C} w(x\to y), w′(c→y)=x∈Cminw(x→y),
сохраняя информацию, от какой конкретной вершины исходило это минимальное ребро (нужно при восстановлении). - Рёбра внутри CCC удаляются (их роль учтена через w(ey)w(e_y)w(ey) в корректировке входящих весов). 3. Рекурсивно находим минимальную арборесценцию в G′G'G′. Это даёт множество рёбер в сжатом графе, в том числе, возможно, входящее в ccc ребро (x→c)(x\to c)(x→c) (или нет, если c=rc=rc=r). 4. Разворачиваем CCC: если в найденном решении в G′G'G′ входящее ребро в ccc соответствует исходному ребру (x→y)(x\to y)(x→y) в GGG (с y∈Cy\in Cy∈C), то в цикле CCC мы удаляем выбранное ранее входящее ребро eye_yey и оставляем остальные выбранные входящие рёбра цикла. Таким образом разрывается цикл и получаем дерево, корректно соединённое с внешней частью решения. Корректность: уменьшение весов при свёртке гарантирует, что выбор входящего ребра в сжатом графе соответствует оптимальному варианту выбора того, в какую вершину цикла "пришло" внешнее соединение, и последующее развёртывание даёт глобально оптимальное решение. Сложность: классическая реализация работает за O(∣V∣⋅∣E∣)O(|V|\cdot |E|)O(∣V∣⋅∣E∣). Существуют более сложные реализации и оптимизации, улучшающие асимптотику (например, с использованием структур данных для быстрого поиска и сжатия). Наглядный пример Пусть V={1,2,3,4}V=\{1,2,3,4\}V={1,2,3,4}, корень r=1r=1r=1. Рёбра и веса: 1→2: 3,1→3: 2,2→3: 1,3→2: 1,2→4: 4,3→4: 2.
1\to 2:\;3,\quad 1\to 3:\;2,\quad 2\to 3:\;1,\quad 3\to 2:\;1,\quad 2\to 4:\;4,\quad 3\to 4:\;2. 1→2:3,1→3:2,2→3:1,3→2:1,2→4:4,3→4:2. Шаг 1 — выбрать минимальные входящие для каждой вершины, кроме корня: e2=3→2 (вес 1),e3=2→3 (вес 1),e4=3→4 (вес 2).
e_2=3\to 2\;(\text{вес }1),\quad e_3=2\to 3\;(\text{вес }1),\quad e_4=3\to 4\;(\text{вес }2). e2=3→2(вес1),e3=2→3(вес1),e4=3→4(вес2).
Эти выбранные рёбра содержат цикл C={2,3}C=\{2,3\}C={2,3} (рёбра 2→32\to 32→3 и 3→23\to 23→2). Шаг 2 — свернём CCC в вершину ccc. Рассчитаем веса входящих рёбер в ccc из вершин вне CCC: - Для 1→21\to 21→2: w′(1→c)=w(1→2)−w(e2)=3−1=2.w'(1\to c)=w(1\to 2)-w(e_2)=3-1=2.w′(1→c)=w(1→2)−w(e2)=3−1=2.
- Для 1→31\to 31→3: w′(1→c)=w(1→3)−w(e3)=2−1=1.w'(1\to c)=w(1\to 3)-w(e_3)=2-1=1.w′(1→c)=w(1→3)−w(e3)=2−1=1.
Выберем минимальный (со значением 111), соответствующий исходному ребру 1→31\to 31→3. Ребра из ccc наружу: c→4: min(w(2→4),w(3→4))=min(4,2)=2
c\to 4:\; \min(w(2\to 4),w(3\to 4))=\min(4,2)=2 c→4:min(w(2→4),w(3→4))=min(4,2)=2
(исходило от 3→43\to 43→4). Сжатый граф: вершины {1,c,4}\{1,c,4\}{1,c,4} с рёбрами 1→c1\to c1→c вес 111, c→4c\to 4c→4 вес 222. Шаг 3 — в сжатом графе выбираем входящие: для ccc — 1→c1\to c1→c (1), для 444 — c→4c\to 4c→4 (2). Ациклично, решение найдено. Шаг 4 — разворачивание цикла CCC. В сжатом решении входящее в ccc ребро соответствовало 1→31\to 31→3. Значит при разворачивании мы включаем 1→31\to 31→3 и в цикле удаляем e3e_3e3 (это было 2→32\to 32→3), оставляя 3→23\to 23→2. В итоге берём рёбра: 1→3 ( 2),3→2 ( 1),3→4 ( 2).
1\to 3\;(\,2),\quad 3\to 2\;(\,1),\quad 3\to 4\;(\,2). 1→3(2),3→2(1),3→4(2).
Суммарный вес 2+1+2=5 \;2+1+2=5\;2+1+2=5 — это минимальная арборесценция корня 111. Краткое резюме - Задача — найти минимальную направленную остовную арборесценцию корня rrr. - Алгоритм Edmonds (Chu–Liu) решает её полиномиально: выбирает минимальные входящие, сворачивает циклы с корректировкой весов, рекурсивно решает задачу на сжатом графе и затем разворачивает циклы. - Основная формула при сжатии входящих рёбер: w′(x→c)=w(x→y)−w(ey)w'(x\to c)=w(x\to y)-w(e_y)w′(x→c)=w(x→y)−w(ey) для y∈Cy\in Cy∈C.
- Дано ориентированный взвешенный граф (V,E)(V,E)(V,E), функция весов w:E→R \;w:E\to\mathbb{R}\;w:E→R и фиксированный источник (корень) r∈V\;r\in Vr∈V.
- Требуется найти подмножество рёбер A⊆EA\subseteq EA⊆E такое, что в ориентированном графе (V,A)(V,A)(V,A) из корня r \;r\;r достижимы все вершины, и суммарный вес ∑e∈Aw(e)\sum_{e\in A} w(e)∑e∈A w(e) минимален.
- Эквивалентное формальное требование: найти минимальную по сумме весов ориентированную остовную арборесценцию (directed spanning arborescence) корня r\;rr — то есть такое подмножество AAA, что
∀v∈V∖{r} : indegA(v)=1,indegA(r)=0, \forall v\in V\setminus\{r\}\;:\;\ indeg_A(v)=1,\qquad indeg_A(r)=0,
∀v∈V∖{r}: indegA (v)=1,indegA (r)=0, и (V,A)(V,A)(V,A) ацикличен (тогда из rrr есть путь в любую вершину). Цель: минимизировать w(A)=∑e∈Aw(e)\;w(A)=\sum_{e\in A} w(e)w(A)=∑e∈A w(e).
Связь с задачей о минимальной арборесценции (Edmonds / Chu–Liu)
- Это именно задача минимальной (корневой) арборесценции. Алгоритм Chu–Liu/Edmonds даёт полиномиальное решение: выбирает для каждой вершины минимальное входящее ребро, обнаруживает и сворачивает циклы, корректирует веса и рекурсивно решает задачу на сжатом графе, затем разворачивает циклы, восстанавливая решение.
Алгоритм (Chu–Liu/Edmonds), суть и формулы
1. Для каждой вершины v≠r \;v\neq r\;v=r выбираем входящее ребро с минимальным весом:
ev=argmin(u→v)∈Ew(u→v). e_v=\arg\min_{(u\to v)\in E} w(u\to v).
ev =arg(u→v)∈Emin w(u→v). Если такие выбранные ребра образуют ацикличный граф, то набор {ev}v≠r\{e_v\}_{v\neq r}{ev }v=r — искомая минимальная арборесценция.
2. Если выбранные ребра содержат цикл(ы), то возьмём любой цикл CCC. Свернём вершины цикла в одну супер-вершину c \;c\;c. Построим сжатый граф G′G'G′ так:
- Для ребра (x→y)(x\to y)(x→y) с x∉C, y∉Cx\notin C,\,y\notin Cx∈/C,y∈/C сохраняем без изменений.
- Для ребра (x→y)(x\to y)(x→y) с x∉C, y∈Cx\notin C,\,y\in Cx∈/C,y∈C вводим ребро (x→c)(x\to c)(x→c) с весом
w′(x→c)=w(x→y)−w(ey), w'(x\to c)=w(x\to y)-w(e_y),
w′(x→c)=w(x→y)−w(ey ), где eye_yey — выбранное минимальное входящее ребро в yyy на шаге 1.
- Для ребра (x→y)(x\to y)(x→y) с x∈C, y∉Cx\in C,\,y\notin Cx∈C,y∈/C вводим ребро (c→y)(c\to y)(c→y) с весом
w′(c→y)=minx∈Cw(x→y), w'(c\to y)=\min_{x\in C} w(x\to y),
w′(c→y)=x∈Cmin w(x→y), сохраняя информацию, от какой конкретной вершины исходило это минимальное ребро (нужно при восстановлении).
- Рёбра внутри CCC удаляются (их роль учтена через w(ey)w(e_y)w(ey ) в корректировке входящих весов).
3. Рекурсивно находим минимальную арборесценцию в G′G'G′. Это даёт множество рёбер в сжатом графе, в том числе, возможно, входящее в ccc ребро (x→c)(x\to c)(x→c) (или нет, если c=rc=rc=r).
4. Разворачиваем CCC: если в найденном решении в G′G'G′ входящее ребро в ccc соответствует исходному ребру (x→y)(x\to y)(x→y) в GGG (с y∈Cy\in Cy∈C), то в цикле CCC мы удаляем выбранное ранее входящее ребро eye_yey и оставляем остальные выбранные входящие рёбра цикла. Таким образом разрывается цикл и получаем дерево, корректно соединённое с внешней частью решения.
Корректность: уменьшение весов при свёртке гарантирует, что выбор входящего ребра в сжатом графе соответствует оптимальному варианту выбора того, в какую вершину цикла "пришло" внешнее соединение, и последующее развёртывание даёт глобально оптимальное решение.
Сложность: классическая реализация работает за O(∣V∣⋅∣E∣)O(|V|\cdot |E|)O(∣V∣⋅∣E∣). Существуют более сложные реализации и оптимизации, улучшающие асимптотику (например, с использованием структур данных для быстрого поиска и сжатия).
Наглядный пример
Пусть V={1,2,3,4}V=\{1,2,3,4\}V={1,2,3,4}, корень r=1r=1r=1. Рёбра и веса:
1→2: 3,1→3: 2,2→3: 1,3→2: 1,2→4: 4,3→4: 2. 1\to 2:\;3,\quad 1\to 3:\;2,\quad 2\to 3:\;1,\quad 3\to 2:\;1,\quad 2\to 4:\;4,\quad 3\to 4:\;2.
1→2:3,1→3:2,2→3:1,3→2:1,2→4:4,3→4:2.
Шаг 1 — выбрать минимальные входящие для каждой вершины, кроме корня:
e2=3→2 (вес 1),e3=2→3 (вес 1),e4=3→4 (вес 2). e_2=3\to 2\;(\text{вес }1),\quad e_3=2\to 3\;(\text{вес }1),\quad e_4=3\to 4\;(\text{вес }2).
e2 =3→2(вес 1),e3 =2→3(вес 1),e4 =3→4(вес 2). Эти выбранные рёбра содержат цикл C={2,3}C=\{2,3\}C={2,3} (рёбра 2→32\to 32→3 и 3→23\to 23→2).
Шаг 2 — свернём CCC в вершину ccc. Рассчитаем веса входящих рёбер в ccc из вершин вне CCC:
- Для 1→21\to 21→2: w′(1→c)=w(1→2)−w(e2)=3−1=2.w'(1\to c)=w(1\to 2)-w(e_2)=3-1=2.w′(1→c)=w(1→2)−w(e2 )=3−1=2. - Для 1→31\to 31→3: w′(1→c)=w(1→3)−w(e3)=2−1=1.w'(1\to c)=w(1\to 3)-w(e_3)=2-1=1.w′(1→c)=w(1→3)−w(e3 )=2−1=1. Выберем минимальный (со значением 111), соответствующий исходному ребру 1→31\to 31→3.
Ребра из ccc наружу:
c→4: min(w(2→4),w(3→4))=min(4,2)=2 c\to 4:\; \min(w(2\to 4),w(3\to 4))=\min(4,2)=2
c→4:min(w(2→4),w(3→4))=min(4,2)=2 (исходило от 3→43\to 43→4).
Сжатый граф: вершины {1,c,4}\{1,c,4\}{1,c,4} с рёбрами 1→c1\to c1→c вес 111, c→4c\to 4c→4 вес 222.
Шаг 3 — в сжатом графе выбираем входящие: для ccc — 1→c1\to c1→c (1), для 444 — c→4c\to 4c→4 (2). Ациклично, решение найдено.
Шаг 4 — разворачивание цикла CCC. В сжатом решении входящее в ccc ребро соответствовало 1→31\to 31→3. Значит при разворачивании мы включаем 1→31\to 31→3 и в цикле удаляем e3e_3e3 (это было 2→32\to 32→3), оставляя 3→23\to 23→2. В итоге берём рёбра:
1→3 ( 2),3→2 ( 1),3→4 ( 2). 1\to 3\;(\,2),\quad 3\to 2\;(\,1),\quad 3\to 4\;(\,2).
1→3(2),3→2(1),3→4(2). Суммарный вес 2+1+2=5 \;2+1+2=5\;2+1+2=5 — это минимальная арборесценция корня 111.
Краткое резюме
- Задача — найти минимальную направленную остовную арборесценцию корня rrr.
- Алгоритм Edmonds (Chu–Liu) решает её полиномиально: выбирает минимальные входящие, сворачивает циклы с корректировкой весов, рекурсивно решает задачу на сжатом графе и затем разворачивает циклы.
- Основная формула при сжатии входящих рёбер: w′(x→c)=w(x→y)−w(ey)w'(x\to c)=w(x\to y)-w(e_y)w′(x→c)=w(x→y)−w(ey ) для y∈Cy\in Cy∈C.