Изменения

Перейти к: навигация, поиск

Алгоритм двух китайцев

46 байт добавлено, 18:28, 11 декабря 2012
Нет описания правки
=== Корректность ===
<br><br>
''' Замечания: '''
Из сделанных замечаний и леммы следует, что дерево <tex>T'</tex> — MST в <tex>G</tex>.
<br><br>
=== Реализация ===
<br><br>
обозначения:
Граф хранится в виде множества ребер + индекс корня.
Ребро - структура из трех чисел - {откуда ребро, куда ребро, вес ребра}.
root - текущий корень.
особенность Особенность реализации: алгоритму не важна кратность ребер. , поэтому при составлении нового графа они могут
появится - это уменьшает асимптотику с <tex>O(V^2)</tex> до <tex>O(E)</tex>
проверяемПроверяем, можно ли дойти из <tex>v</tex> до остальных вершин. Если можно - запускаем <tex>findMST</tex> <tex>findMST(edges, n, root)</tex>:
int result = 0;
int minEdge[n]; // создаем массив минимумов, входящих в каждую компоненту, инициализируем бесконечностью.
if (текущее ребро равно по весу минимальному, входящему в эту вершину)
zeroEdges.pushback(<tex>e_1</tex>) // <tex>e_1</tex> - ребро е, уменьшенное на минимальный вес, входящий в e.to
<tex>dfs(root, zeroEdges) </tex> // проверяем, можно ли дойти до всех вершин по нулевым ребрам
if (можно дойти)
return res
int newComponents[n]; // будущие компоненты связности
newComponents = <tex>Сondensation(zeroEdges) </tex>
edge newEdges[] //создаем массив ребер в новом графе с вершинами в сконденсированными компонентами
for each <tex>e \in</tex> zeroEdges
if (концы e лежат в разных компонентах связности)
добавляем в newEdges ребро с концами в данных компонентах и весом e.w
res += <tex>findMST(zeroEdges, ComponentsCount, newComponents[root])</tex>
return res
234
правки

Навигация