Изменения

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

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

238 байт добавлено, 18:21, 11 декабря 2012
Реализация
Ребро - структура из трех чисел - {откуда ребро, куда ребро, вес ребра}.
root - текущий корень.
особенность реалреализации: алгоритму не важна кратность ребер. поэтому при составлении нового графа они могут появится - это уменьшает асимптотику с <tex>O(V^2)</tex> до <tex>O(E)</tex>
проверяем, можно ли дойти из <tex>v</tex> до остальных вершин. Если можно - запускаем <tex>findMST</tex>
findMST(edges, n, root):
int result = 0;
int minEdge[n]; // создаем массив минимумов, входящих в каждую компоненту, инициализируем бесконечностью.
for each <tex>e \in E</tex>
if (текущее ребро равно по весу минимальному, входящему в эту вершину)
zeroEdges.pushback(<tex>e_1</tex>) // <tex>e_1</tex> - ребро е, уменьшенное на минимальный вес, входящий в e);.to
dfs(root, zeroEdges) // проверяем, можно ли дойти до всех вершин по нулевым ребрам
if (можно дойти)
newComponents = Сondensation(zeroEdges)
edge newEdges[] //создаем массив ребер в новом графе с вершинами в сконденсированными компонентами
vector<pair<pair for each <int, int>, long long>tex> Edges = vectore \in<pair<pair<int, int/tex>, long long>>(); for (int i = 0; i < G.r.size(); i++){zeroEdges if (comp1[G.r[i].first.first] != comp1[G.r[i].first.second]концы e лежат в разных компонентах связности) Edges.push_back(make_pair(make_pair(comp1[G.r[i].first добавляем в newEdges ребро с концами в данных компонентах и весом e.first], comp1[G.r[i].first.second]), G.r[i].second - minEdge[G.r[i].first.second]));w } int compon(0); for (int i = 0; i < G.n; i+ res +){ compon = maxfindMST(componzeroEdges, comp1[i]); } graph G2 = graph(compon + 1ComponentsCount, comp1newComponents[G.root], Edges); Edges.clear(); res += findMST(G2); return res;
=== Сложность ===
234
правки

Навигация