Я пытаюсь найти эффективный метод определения, имеет ли данный граф G два разных минимальных остовных дерева. Я также пытаюсь найти метод, чтобы проверить, есть ли у него 3 различных минимальных остовных дерева. Наивное решение, о котором я думаю, - запустить алгоритм Крускала один раз и найти общий вес минимального остовного дерева. Позже удаляем ребро из графа и снова запускаем алгоритм Крускала и проверяем, является ли вес нового дерева весом исходного минимального остовного дерева, и так для каждого ребра в графе. Время выполнения равно O (| V || E | log | V |), что совсем не хорошо, и я думаю, что есть лучший способ сделать это.
Любое предложение будет полезно, спасибо заранее
Ответы:
Kapoor & Ramesh ( правильная версия SIAM J. Comput. , Бесплатная (?) Версия личного веб-сайта ) предоставляют алгоритм для перечисления всех минимальных остовных деревьев как на взвешенных, так и на невзвешенных графиках.
Мое понимание основной идеи состоит в том, что вы начинаете с одного MST, а затем меняете ребра, которые лежат вдоль циклов на графике (поэтому, пока весовые коэффициенты в порядке, вы заменяете одно ребро другим, которое, как вы знаете, будет повторно соединять дерево) ,
Для взвешенного случая они дают время выполнения, чтобы перечислить все минимальные остовные деревья где N - количество таких остовных деревьев. Он перечисляет их в порядке увеличения веса, и мое текущее (поверхностное) понимание предполагает, что вполне возможно завершить алгоритм после того, как он сгенерировал заданное количество деревьев (так как он только начинается с MST и производит их последовательно).O ( N⋅ | В| ) N
источник
Можно показать, что алгоритм Крускала может найти каждое минимальное остовное дерево; см здесь .
Следовательно, вы можете выполнить Kruskal и, когда у вас есть несколько ребер на выбор, переходить.
После того как вы разветвились раз, вы знаете, что существует как минимум k различных минимальных остовных деревьев.К К К сожалению, несколько ветвей могут привести к одному и тому же дереву, если добавить ребра одинакового веса в разных порядках, так что это мало поможет без дальнейшей работы / понимания.источник
Чтобы увидеть, существует ли более одного MST, рассмотрим, например, алгоритм Крускала. Единственный способ построить разные MST - это исключить ребра, выбрав другой, когда есть несколько с одинаковым весом. Но эти края одинакового веса могли быть исключены, потому что они образовали цикл с более светлыми краями ...
Таким образом, вы должны запустить алгоритм Крускала, и, когда нужно рассмотреть несколько ребер с одинаковым весом, добавьте все из них, которые можно добавить, не создавая циклы. Если остался край этого веса, и он не закрывает цикл ни с одним из ребер с меньшим весом (которые были добавлены ранее), существует более одного MST. Проверка, есть ли ровно 2 или 3 и более, выглядит намного сложнее ...
источник
Модификация алгоритма Крускала: при упорядочении ребер кластеризуйте ребра с одинаковым весом. Теперь, в точке, где вы обрабатываете ребра по порядку, каждый раз, когда вы достигаете нового кластера, сначала проверяйте все ребра отдельно и удаляйте из кластера те, которые будут замыкать цикл, учитывая то, что было построено до кластера. Затем запустите все оставшиеся ребра в кластере, теперь пытаясь добавить их в MST. Если какой-либо из них закрывает цикл, то это было обязательно из-за того, что ранее были вставлены другие ребра того же кластера, что означает, что у вас более одного MST.
Это решение сохраняет сложность алгоритма Крускала, только увеличивает время обработки каждого ребра.
источник