234
правки
Изменения
→Реализация
=== Реализация ===
<br><br> лолололобозначения: цу Граф хранится в виде множества ребер + индекс корня. Множество ребер - список смежности. Ребро - структура из трех чисел - {откуда ребро, куда ребро, вес ребра}. root - текущий корень. проверяем, можно ли дойти из <tex>v</tex> до остальных вершин. Если можно - запускаем <tex>findMST</tex> findMST: 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 != root</tex> res += minEdge[v] //веса минимальных ребер точно будут в результате edge zeroEdges[] //создаем массив нулевых ребер for each <tex>e \in E</tex> if (текущее ребро равно по весу минимальному, входящему в эту вершину) zeroEdges.pushback(e); вцвфцвфц // нашли все нулевые дуги graph G1 = graph(G.n, G.root, zeroEdges); zeroEdges.clear(); if (isConnect(G1)){ return res; } vector<int> comp1 = Components(G1); //теперь у нас есть новые компоненты G1.r.clear(); 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]) Edges.push_back(make_pair(make_pair(comp1[G.r[i].first.first], comp1[G.r[i].first.second]), G.r[i].second - minEdge[G.r[i].first.second])); } int compon(0); for (int i = 0; i < G.n; i++){ compon = max(compon, comp1[i]); } graph G2 = graph(compon + 1, comp1[G.root], Edges); Edges.clear(); вц res += findMST(G2); цв return res;
=== Сложность ===