Я был представлен следующая проблема в Университете:
Позвольте G = (V, E) быть (неориентированным) графиком с затратами ce> = 0 на краях e ∈ E. Предположите предоставление стоившего за минимум связующего дерева T в G. Теперь предположите, что новый край добавляется к G, соединяя два узла v, ТВ ∈ V со стоимостью c.
Это - решение, которое я нашел:
Let e1=(a,b) the new edge added
Find in T the shortest path from a to b (BFS)
if e1 is the most expensive edge in the cycle then T remains the MST
else T is not the MST
Это, кажется, работает, но я могу легко сделать это выполнение в O (|V |) временем, в то время как проблема спрашивает O (|E |) время. Я пропускаю что-то?
По тому, как мы разрешены обратиться за помощью от любого так, что я не обманываю :D
Я считаю, что ваш шаг Найти в T кратчайший путь от a до b
является операцией порядка E.
Я думаю, что BFS было бы достаточно. И его сложность составляет O (| V | + | E |), но в дереве | E | меньше | V | так что O (2 | V |) это O (| V |)
У вас есть правильная идея, хотя вы может лучше, чем BFS, для поиска по кратчайшему пути, если вы правильно храните дерево.
Скажем, один узел r в T является корнем (вы можете выбрать любой узел и BFS оттуда, чтобы сгенерировать эту структуру, если вы отметили края дерева в матрице или смежности -list структура графа), и каждый другой узел имеет родительский указатель и счетчик глубины. Чтобы найти кратчайший путь между a и b в T :
Доказательство справедливости этого алгоритма предоставляется читателю в качестве упражнения. Это O (| V |), как у BFS, но обычно будет быстрее. Только несколько конфигураций MST на практике потребуют времени O (| V |).Конечно, создание дерева родительских ссылок для начала занимает O (| V |) времени, поэтому это помогает только в некоторых обстоятельствах, например, если вы используете алгоритм построения MST, который естественным образом создает эту структуру в процессе определения MST.
Как сказал другой комментатор, обратите внимание, что если существует MST для графа, он связан, поэтому | V | <= | E | и, следовательно, O (| V |) Кроме того, чтобы исправить дерево за время O (| V |), если необходимо, просто найдите самое длинное ребро в цикле и удалите его, заменив новым ребром. Эффективное выполнение этого с помощью MST родительской ссылки также является упражнением для читателя.