Как найти общее количество минимальных остовных деревьев на графике?
Я не хочу, чтобы найти все минимальные остовные деревья, но я хочу знать, сколько их там, вот метод, который я считал:
- Найдите одно минимальное связующее дерево, используя алгоритм prim или kruskal, а затем найдите весом всех связующих деревьев и увеличить счетчик, когда он равен весу минимального связующего дерева.
Я не мог найти никакого метода, чтобы найти веса всех охватывающих деревьев а также количество остовных деревьев может быть очень большим, поэтому этот метод может не подходить для задачи. Поскольку число минимальных охватывающих деревьев экспоненциально, подсчет их не будет хорошей идеей.
- все веса будут положительными.
- мы также можем предположить, что ни один вес не будет отображаться более трех раз на графике.
- число вершин будет меньше или равно 40 000.
- число ребер будет меньше или равен 100 000.
существует только одно минимальное связующее дерево в графе, где Весы вершин различны. Я думаю, что лучший способ найти количество минимального остовного дерева должен быть чем-то, используя это свойство.
редактировать:
Я нашел решение этой проблемы, но я не уверен, почему это работает. Может кто-нибудь объяснить.
решение: проблема нахождения длины минимального связующего дерева довольно хорошо известно; два простейших алгоритма поиска минимального остовного дерева-алгоритм Прима и алгоритм Крускала. Из этих двух алгоритм Крускала обрабатывает ребра в порядке увеличения их веса. Однако есть важный ключевой момент алгоритма Крускала: при рассмотрении списка ребер, отсортированных по весу, ребра могут быть жадно добавлены в связующее дерево (если они не соединяют две вершины, которые уже каким-то образом связаны).
теперь рассмотрим частично сформированное связующее дерево с использованием алгоритма Крускала. Мы вставили некоторое количество ребер с длиной меньше N и теперь должны выбрать несколько ребер длины N. алгоритм утверждает, что мы должны вставить эти ребра, если это возможно, перед любыми ребрами с длиной больше N. Однако мы можем вставить эти ребра в любом порядке, который мы хотим. Также обратите внимание, что независимо от того, какие ребра мы вставляем, это не меняет связность графика вообще. (Рассмотрим два возможных графы, один с ребром от вершины A до вершины B и один без. Второй граф должен иметь A и B как часть одного и того же Связного компонента; в противном случае ребро от A до B было бы вставлено в одной точке.)
эти два факта вместе означают, что наш ответ будет произведением количества способов, используя алгоритм Крускала, вставить ребра длины K (для каждого возможного значения K). Поскольку существует не более трех ребер любой длины, различные случаи могут быть грубый принудительный, и подключенные компоненты могут быть определены после каждого шага, как это было бы обычно.
2 ответов
глядя на алгоритм Prim, он говорит, чтобы повторно добавить ребро с наименьшим весом. Что произойдет, если существует более одного края с наименьшим весом, который можно добавить? Возможно, выбор одного может дать другое дерево, чем при выборе другого.
Если вы используете алгоритм prim и запускаете его для каждого ребра в качестве начального ребра, а также выполняете все связи, с которыми вы сталкиваетесь. Тогда у вас будет лес, содержащий все минимальные охватывающие деревья, которые может найти алгоритм Prim. Я не знаю, равно ли это лесу, содержащему все возможные минимальные охватывающие деревья.
Это все еще сводится к поиску всех минимальных охватывающих деревьев, но я не вижу простого способа определить, даст ли другой выбор то же самое дерево или нет.
MST и их количество в графе хорошо изучены. См., например: http://www14.informatik.tu-muenchen.de/konferenzen/Jass08/courses/1/pieper/Pieper_Paper.pdf.