Предположим, нам даны
неориентированный граф g
, где каждый узел i, 1 ‹= i‹ n связан со всеми j, i ‹j‹ = n
и источник s
.
Мы хотим найти общие затраты (определяемые как сумма весов всех ребер) самого дешевого минимального остовного дерева, которое отличается от дерева минимальных расстояний s
(т. Е. От MST, полученного запуском prim / dijkstra на s
) хотя бы одним краем.
Как лучше всего с этим справиться? Потому что в настоящее время я могу думать только о какой-то итерации с фиксированной точкой
- запустите dijkstra на
(g,s)
, чтобы получить опорный графикr
, который нам нужно отличать от costs := sum(edge_weights_of(r))
change := 0
- для каждой вершины
u
вr
запустите bfs и отметьте для каждой достигнутой вершиныv
самое длинное ребро на пути отu
доv
. - перебрать все ребра
e = (a,b)
вg
: найтиe'=(a',b')
, который НЕ находится вr
и минимизироватьnewchange := weight(e') - weight(longest_edge(a',b'))
- if (first_time_here OR
newchange < 0
) thenchange += newchange
- если (новое изменение ‹0)
goto 4
result := costs + change
Кажется, это напрасная трата времени ... Это основано на том факте, что добавление ребра к остовному дереву создает цикл, из которого мы можем удалить самое длинное ребро.
Я также думал об использовании Kruskal, чтобы получить общее минимальное остовное дерево, и использовать только описанный выше алгоритм для замены одного ребра, когда деревья из обоих, prim и kruskal, оказываются одинаковыми, но это, похоже, не работает как Результат будет сильно зависеть от краев, выбранных во время запуска краскала.
Есть предложения / подсказки?
s
совпадает с MST. Я предполагаю, что это очень специфические обстоятельства (s
находится в центре графика, что бы это ни значило формально). - person Vincent van der Weele   schedule 27.12.2015