Алгоритм двох китайців
Алгоритм двох китайців — алгоритм побудови мінімального кістякового дерева в підвішеному орієнтованому графі з коренем в заданій вершині. Був розроблений математиками Чу Йонджіном і Лю Цзенхонгом.
Постановка задачі
Задано зважений орієнтований граф і початкова вершина . Потрібно побудувати кореневе остовне дерево в з коренем у вершині , сума ваг усіх ребер якого мінімальна.
Алгоритм
Опис
Якщо хоча б одна вершина графу недосяжна з , то необхідне дерево побудувати не можна.
|
Реалізація
Позначення:
- Граф зберігається у вигляді множини ребер + індекс кореня.
- Множина ребер - список суміжності.
- Ребро - структура {from, to, weight}.
- root - поточний корінь.
Особливість реалізації: алгоритмом не важлива кратність ребер, тому при складанні нового графу кратні ребра можуть з'явитися - це зменшує асимптотику з до
int findMST(edges, n, root):
int res = 0
int minEdge[n] // створюємо масив мінімумів, що входять у кожну компоненту, ініціалізуємо нескінченністю.
for each
minEdge[e.to] = min(e.w, minEdge[e.to])
for each
res += minEdge[v] //ваги мінімальних ребер точно будуть в результаті
edge zeroEdges[] //створюємо масив нульових ребер
for each
if e.w == minEdge[e.to]
zeroEdges.pushback() // - ребро е, зменшене на мінімальну вагу, що входить до e.to
if dfs(root, zeroEdges) // перевіряємо, чи можна дійти до всіх вершин за нульовими ребрах
return res
int newComponents[n] // майбутні компоненти зв'язності
newComponents = Condensation(zeroEdges)
edge newEdges[] //створюємо масив ребер у новому графі з вершинами в отриманих компонентах
for each zeroEdges
if e.to і e.from в різних компонентах
додаємо в newEdges ребро з кінцями в даних компонентах і вагою e.w
res += findMST(zeroEdges, ComponentsCount, newComponents[root])
return res
Складність
Всього буде побудовано не більше конденсацій. Конденсацію можна побудувати за . Значить, алгоритм можна реалізувати за .
Джерела
- Романовский И. В. Дискретный анализ, 3-е изд., перераб. и доп. - СПб.:Невский Диалект; БХВ-Петербург, 2003. - 320 с.: ил. (233 страница) - ISBN 5-7940-0114-3
- http://is.ifmo.ru Шаблон:Webarchive