Как найти максимальное связующее дерево? - PullRequest
50 голосов
/ 14 февраля 2011

Работает ли для него противоположность алгоритма Крускала для минимального связующего дерева?Я имею в виду, выбирая максимальный вес (ребро) каждого шага?

Любая другая идея, чтобы найти максимальное связующее дерево?

Ответы [ 7 ]

58 голосов
/ 14 февраля 2011

Да, это так.

Один из методов вычисления максимального веса связующего дерева сети G - из-за Крускала - можно резюмировать следующим образом.

  1. Сортировка ребер G по убыванию веса. Пусть T будет множеством ребер, составляющих связующее дерево максимального веса. Установите T = ∅.
  2. Добавьте первое ребро к T.
  3. Добавьте следующее ребро к T тогда и только тогда, когда оно не образует цикл в T. Если нет оставшихся ребер выхода и отчет G должен быть отключен.
  4. Если T имеет n − 1 ребер (где n - число вершин в G), остановка и выход т. В противном случае перейдите к шагу 3.

Источник: https://web.archive.org/web/20141114045919/http://www.stats.ox.ac.uk/~konis/Rcourse/exercise1.pdf.

36 голосов
/ 14 февраля 2011

С это веб-сайт:

«Максимальное остовное дерево - это остовное дерево взвешенного графа, имеющего максимальный вес. Его можно вычислить, обнуляя веса для каждого ребра и применяя алгоритм Крускала (Pemmaraju and Skiena, 2003, p. 336).»

6 голосов
/ 14 февраля 2011

Если вы инвертируете вес на каждом ребре и минимизируете, получите ли вы максимальное связующее дерево?Если это работает, вы можете использовать тот же алгоритм.Нулевой вес будет проблемой, конечно.

4 голосов
/ 10 августа 2014

Хотя этот поток слишком старый, у меня есть другой подход для нахождения максимального связующего дерева (MST) в графе G = (V, E)

Мы можем применить некоторый алгоритм Прима для нахождения MST,Для этого я должен определить свойство обрезки для максимального взвешенного края.

Свойство обрезки: допустим, в любой точке у нас есть набор S, который содержит вершины в MST (на данный момент предположим, что он каким-то образом рассчитывается),Теперь рассмотрим набор S / V (вершины не в MST):

Заявка: ребро от S до S / V, имеющее максимальный вес, всегда будет в каждом MST.

Доказательство:Скажем, в момент, когда мы добавляем вершины к нашему множеству S, максимальный взвешенный край от S до S / V равен e = (u, v), где u находится в S, а v находится в S / V.Теперь рассмотрим MST, который не содержит e.Добавьте ребро e в MST.Это создаст цикл в оригинальном MST.Пройдите через цикл и найдите вершины u 'в S и v' в S / V так, чтобы u 'была последней вершиной в S, после чего мы вводим S / V, а v' - первая вершина в S / V на пути вцикл от u до v.

Удалите ребро e '= (u', v '), и результирующий граф все еще подключен, но вес e больше, чем e' [так как e - максимальное взвешенное реброот S до S / V в этой точке], так что это приводит к MST, у которого сумма весов больше, чем у исходного MST.Так что это противоречие.Это означает, что ребро e должно быть в каждом MST.

Алгоритм нахождения MST:

Start from S={s}   //s is the start vertex
while S does not contain all vertices
 do 
 {
  for each vertex s in S
  add a vertex v from S/V such that weight of edge e=(s,v) is maximum 
  }
end while

Реализация: мы можем реализовать, используя Max Heap / Priority Queue, где ключ - это максимальный весребро от вершины в S до вершины в S / V и значением является сама вершина.Добавление вершины в S равно Extract_Max из кучи, и при каждом Extract_Max меняйте ключ вершин, смежных с только что добавленной вершиной.

Таким образом, требуется m операций Change_Key и n операций Extract_Max.

Extract_Min и Change_Key оба могут быть реализованы в O (log n).n - количество вершин.

Так что это занимает O (m log n) времени.m - количество ребер в графе.

1 голос
/ 02 февраля 2017

Позвольте мне предоставить алгоритм улучшения:

  • сначала создайте произвольное дерево (используя BFS или DFS)
  • , затем выберите ребро за пределами дерева, добавьте к дереву, оносформирует цикл, отбросив наименьшее ребро веса в цикле.
  • продолжайте делать это, используя все остальные ребра, считающиеся

Таким образом, мы получим максимальное остовное дерево.


Это дерево удовлетворяет любому ребру за пределами дерева, если добавленное будет формировать цикл, а ребро за пределами <= любых весов ребер в цикле </p>

На самом деле, это необходимо идостаточное условие, чтобы остовное дерево было максимальным остовным деревом.

Pf.

Необходимо: очевидно, что это необходимо, или мы могли бы поменять местами ребро, чтобы получить дерево с большей суммой весов ребер.

Достаточно: предположим, что дерево T1 удовлетворяет этому условию, а T2максимальное связующее дерево.

Тогда для ребер T1 ∪ T2 имеются ребра только T1, ребра только T2, ребра T1 ∩ T2, если мы добавим ребро только T1 (x1, xk)что касается T2, мы знаем, что он будет образовывать цикл, и мы утверждаем, что в этом цикле должно существовать одно ребро только для T2, которое имеет те же веса ребер, что и (x1, xk) .Затем мы можем обменять эти ребра, чтобы получить дерево с еще одним ребром, общим с T2, и иметь ту же сумму весов ребер, повторяя это, мы получим T2.поэтому T1 также является максимальным остовным деревом.

Докажите утверждение:

предположим, что это не так, в цикле мы должны иметь ребро только для T2, так как T1 - дерево.Если ни одно из ребер, имеющих только T2, не имеет значения, равного значению (x1, xk), то каждое из ребер, имеющих только T2, создает цикл с деревом T1, тогда цикл T1 приводит к противоречию.

enter image description here


Этот алгоритм взят из заметок профессора UTD Р. Чандрасекарана.Вы можете сослаться здесь: Потоки одного товара с несколькими терминалами

1 голос
/ 10 октября 2015

Только изменение порядка сортировки и выбор толстого края в разрезе вершины не гарантирует максимальный остовный лес (алгоритм Крускала создает лес, а не дерево). В случае, если все ребра имеют отрицательные веса, Max Spanning Forest, полученный из реверса kruskal, все равно будет трассой с отрицательным весом. Однако идеальный ответ - это лес несвязных вершин. то есть лес | V | одиночные деревья или | V | компоненты, имеющие общий вес 0 (не в последнюю очередь отрицательный).

1 голос
/ 24 декабря 2012

Отрицание веса исходного графа и вычисление минимального остовного дерева на отрицательном графе даст правильный ответ. Вот почему: для одного и того же остовного дерева в обоих графах взвешенная сумма одного графа является отрицанием другого. Таким образом, минимальное остовное дерево отрицательного графа должно давать максимальное остовное дерево исходного.

...