Изменения

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

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

276 байт убрано, 00:37, 12 декабря 2012
Реализация
=== Реализация ===
<br>
обозначенияОбозначения: *Граф хранится в виде множества ребер + индекс корня. *Множество ребер - список смежности. *Ребро - структура из трех чисел - {откуда реброfrom, куда реброto, вес ребраweight}. *root - текущий корень. Особенность реализации: алгоритму не важна кратность ребер, поэтому при составлении нового графа они могут появится - это уменьшает асимптотику с <tex>O(V^2)</tex> до <tex>O(E)</tex>
ПроверяемОсобенность реализации: алгоритму не важна кратность ребер, можно ли дойти из поэтому при составлении нового графа кратные ребра могутпоявиться - это уменьшает асимптотику с <tex>vO(V^2)</tex> до остальных вершин. Если можно - запускаем <tex>findMSTO(E)</tex>
Проверяем, можно ли дойти из <tex>v</tex> до остальных вершин. Если можно - запускаем findMST. int findMST(edges, n, root)</tex>: int result = 0; int minEdge[n]; // создаем массив минимумов, входящих в каждую компоненту, инициализируем бесконечностью.
for each <tex>e \in E</tex>
minEdge[e.to] = min(e.w, minEdge[e.to])
for each <tex>v \in V, v != \backslash \{root\}</tex>
res += minEdge[v] //веса минимальных ребер точно будут в результате
edge zeroEdges[] //создаем массив нулевых ребер
for each <tex>e \in E</tex>
if (текущее ребро равно по весу минимальному, входящему в эту вершину)e.w == minEdge[e.to]
zeroEdges.pushback(<tex>e_1</tex>) // <tex>e_1</tex> - ребро е, уменьшенное на минимальный вес, входящий в e.to
<tex>if 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 лежат .to и e.from в разных компонентах связности)
добавляем в newEdges ребро с концами в данных компонентах и весом e.w
res += <tex>findMST(zeroEdges, ComponentsCount, newComponents[root])</tex>
return res
234
правки

Навигация