Построить эффективное минимальное остовное дерево, такое что заданное подмножество вершин в G является листьями + доказательство

Я пытаюсь разработать алгоритм, в котором для связного взвешенного графа G = (V, E) и подмножества вершин U, которое находится в V, будет построено минимальное остовное дерево, такое что все вершины в U являются листьями (другие вершины могут также быть листьями) или возвращает, что такого дерева не существует (False).

Это все, что я получил, адаптировав алгоритм Прима (справедливое предупреждение, это действительно плохо; я даже не знаю, работает ли он/эффективен или какие структуры данных использовать, я приму буквально любой другой правильный алгоритм вместо):

Let x be an arbitrary node in G
Set S = {x}
While S != V:
    Let (u,v) be the cheapest edge with u in S and v not in S
    Add (u,v) to tree T if u is not in U, add v to S

If all u in U is in the tree T:
    return T
Else:
    return False

У меня также есть картина того, что, по моему мнению, это сделает с нарисованным мной графиком: pic here

Доказательство того, что алгоритм верен, также дало бы мне некоторое спокойствие.


person iheartcoding124    schedule 15.10.2020    source источник
comment
Небольшой комментарий: Let (u,v) be the cheapest edge with u in S and v not in S следует исключать вершины u in G, которые вы уже использовали, иначе они не стали бы листьями.   -  person Vincent van der Weele    schedule 15.10.2020
comment
@VincentvanderWeele о да, спасибо. Помимо этого, как вы думаете, эта адаптация сработает?   -  person iheartcoding124    schedule 15.10.2020
comment
Я думаю, что и ваш подход, и ответ ниже работают. Однако правильность другого подхода кажется легче доказать.   -  person Vincent van der Weele    schedule 15.10.2020
comment
@VincentvanderWeele на самом деле быстрый комментарий к вашему второстепенному комментарию (смеется): почему я должен исключать вершины u в G, которые я уже использовал? У меня уже есть строка, в которой, если у ребра (u, v) есть узел u, который находится в U, ребро все равно не будет добавлено в дерево. Если этот узел, который находится в U, вместо этого равен v, это ребро можно было бы добавить к дереву, сделав его конечным узлом.   -  person iheartcoding124    schedule 16.10.2020
comment
А, у вас есть еще один if во второй строке, чтобы убедиться, что u и v не могут быть одновременно в U. Я пропустил это.   -  person Vincent van der Weele    schedule 16.10.2020


Ответы (1)


Если все вершины u ∈ U должны быть листьями в решении, никаких u можно использовать в этом решении для соединения двух других вершин. Все вершины, не входящие в U, должны быть соединены ребрами, не инцидентными никакому u.

Удалите U и все ребра, инцидентные U. Найдите минимальное остовное дерево, затем соедините каждое u с деревом с помощью наименьшего взвешенного ребра, доступного из тех, которые мы удалили.

person גלעד ברקן    schedule 15.10.2020
comment
Я не думаю, что это сработает, особенно удаление всех ребер, связанных с частью u. Если мы это сделаем, мы можем получить несвязный граф и не сможем найти минимальное остовное дерево узлов, оставшихся в графе. - person iheartcoding124; 16.10.2020
comment
Кроме того, я не думаю, что это особенно эффективно, особенно если вы храните дерево в виде кучи в очереди с приоритетами. - person iheartcoding124; 16.10.2020
comment
@ iheartcoding124, пожалуйста, приведите очень простой пример с правильным решением, где это не сработает. - person גלעד ברקן; 16.10.2020
comment
@iheartcoding124 iheartcoding124 что касается эффективности, я бы сказал, что это кажется более эффективным, поскольку поиск минимального остовного дерева на меньшем графе требует меньше ресурсов. - person גלעד ברקן; 16.10.2020
comment
ох, подождите, неважно, я смотрел на свой пример, который я сфотографировал, и забыл удалить ребро, связанное с D, которое связано с B, поэтому я подумал, что у меня есть отсоединенный граф для второго, лол. - person iheartcoding124; 16.10.2020
comment
Что касается времени выполнения, я думал о хранении графа в виде списка смежности, где каждый узел является ключом, а его соседи — его значениями; эти значения будут списком узла и его соответствующего веса (например, если бы у C были соседи E и W, запись для C в словаре была бы {C:[[E, w(E)], [W, w( W)]]}. Затем для каждого узла в U найдите ключ и удалите его, затем сохраните его и его значение в другом списке/словаре.После MST повторите список/словарь и найдите соседа с самым дешевым весом для каждой записи найдите этого соседа в куче и установите соседа соседа как запись. - person iheartcoding124; 16.10.2020
comment
Я думаю, что поиск узла в куче — это O (log (n)), и я предполагаю, что добавление записи в качестве его соседа — это просто O (1), поскольку это уже листовой узел, поэтому не будет никакой кучи? - person iheartcoding124; 16.10.2020
comment
@ iheartcoding124 Я считаю, что поиск в простой куче будет иметь более высокую сложность в худшем случае, чем O (log n). Я знаю индексированную кучу, которая, я думаю, может иметь O (1) поиск индексированного элемента. Я не могу говорить о последнем шаге добавления записи без лучшего понимания решения. Я вообще не знаком с реализациями MST. - person גלעד ברקן; 16.10.2020
comment
Некоторые наблюдения здесь, почему это правильно. 1) При удалении листа с дерева результатом остается дерево. Таким образом, если существует MSP со всеми листьями U, то также существует MSP на V \ U. 2) Для каждого u in U ребро, соединяющее его с MSP V \ U, является ребром с наименьшим весом. Это верно, потому что между двумя вершинами в U не может быть ребра (не все U являются листьями), а вес не может быть выше, противоречие (переключение ребра дало бы дерево с меньшим общим весом). 3) Из предыдущих 2 пунктов остовное дерево V \ U должно быть MSP, а наоборот. - person Vincent van der Weele; 16.10.2020
comment
@ iheartcoding124 (вас может заинтересовать комментарий Винсента ван дер Вила чуть выше. Я подумал, что упомяну его, поскольку они не отметили вас.) - person גלעד ברקן; 16.10.2020
comment
@גלעדברקן спасибо! У меня закончились 600 символов :) - person Vincent van der Weele; 16.10.2020