Изменения

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

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

247 байт добавлено, 17:57, 11 декабря 2012
Реализация
Ребро - структура из трех чисел - {откуда ребро, куда ребро, вес ребра}.
root - текущий корень.
особенность реал
проверяем, можно ли дойти из <tex>v</tex> до остальных вершин. Если можно - запускаем <tex>findMST</tex>
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 != root</tex>
res += minEdge[v] //веса минимальных ребер точно будут в результате
edge zeroEdges[] //создаем массив нулевых ребер
for each <tex>e \in E</tex>
if (текущее ребро равно по весу минимальному, входящему в эту вершину)
zeroEdges.pushback(e);
вцвфцвфц // нашли все нулевые дуги graph G1 = graphdfs(G.n, G.root, zeroEdges); zeroEdges.clear();// проверяем, можно ли дойти до всех вершин по нулевым ребрам if (isConnect(G1)можно дойти){ return res; } vector< int> comp1 = Components(G1)newComponents[n]; //теперь у нас есть новые будущие компонентысвязности G1.r.clear newComponents = Сondensation(zeroEdges); edge newEdges[] //создаем массив ребер в новом графе с вершинами в сконденсированными компонентамиvector<pair<pair<int, int>, long long>> Edges = vector<pair<pair<int, int>, long long>>();
for (int i = 0; i < G.r.size(); i++){
if (comp1[G.r[i].first.first] != comp1[G.r[i].first.second])
234
правки

Навигация