Минимизируйте стоимость соединения графа, соединяя любые пары вершин, стоимость которых не меньше 0.

Опубликовано: 21 Сентября, 2022

Для заданного несвязного графа G с N вершинами и M ребрами и массива cost[] , соответствующего каждой вершине, задача состоит в том, чтобы найти минимальную стоимость построения графа путем соединения любых пар вершин, имеющих стоимость вершин не менее 0 , и стоимость соединения этих пар вершин равна сумме стоимости отдельных вершин. Если это невозможно, то выведите «-1» .

Примеры:

Input: N = 6, G[] = {{3, 1}, {2, 3}, {2, 1}, {4, 5}, {5, 6}, {6, 4}}, cost[] = {2, 1, 5, 3, 2, 9}
Output: 3
Explanation: The initial graph has two connected components – {1, 2, 3} and {4, 5, 6}. We can add an edge between 2 to 5 at a cost of cost[2] + cost[5] = 1 + 2 = 3. After adding this edge, the whole graph is connected.

Input: N = 6, G[] = {{3, 1}, {2, 3}, {2, 1}, {4, 5}, {5, 6}, {6, 4}}, cost[] = {2, 1, 5, -3, -2, -9}
Output: -1
Explanation: It is not possible to make the graph connected

Подход: Данная задача может быть решена с использованием структуры данных Disjoint Set Union. Идея состоит в том, чтобы сохранить все минимальные значения, которые больше или равны 0 , скажем, minVal[] для всех различных подключенных компонентов, и проверить, меньше ли какое-либо значение в minVal[] нуля, если оно верно , затем вывести -1 , В противном случае найдите минимальное значение в minVal[] , скажем min , и найдите сумму всех минимальных значений с минимальным значением и выведите ответ.

Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте вектор minVal[] , чтобы найти минимальный элемент каждого набора.
  • Инициализируйте векторы parent(N+1), rank(N+1, 0), minVal(N+1) .
  • Инициализируйте набор, скажем, s , чтобы сохранить родителя каждого набора.
  • Инициализируйте переменную, скажем, minCost , которая хранит минимальную стоимость.
  • Переберите диапазон [1, N+1), используя переменную i , и установите значение parent[i] как I и minVal[i] как cost[i – 1] .
  • Перебрать вектор G , используя переменную i , и вызвать функциональную операцию Union(parent, rank, minVal, i.first, i.second) .
  • Переберите диапазон [1, N+1), используя переменную i , и вставьте родительский элемент I в s .
  • Переберите набор s и найдите минимальное значение s , сохраните его в min и отметьте флаг как истинный, если какое-либо значение отрицательное.
  • Если данный граф уже связан или значение флага ложно , то:
    • Переберите s , используя переменную I , и если минимальное значение не равно I , обновите значение minCost до minCost += (minVal[i] + min.second) .
    • После выполнения вышеуказанного шага выведите значение minCost как результирующую минимальную стоимость.
  • В противном случае выведите -1 .

Ниже приведена реализация вышеуказанного подхода:


Временная сложность: O(N*log M)
Вспомогательное пространство: O(N)