Я искал реализацию (я пользуюсь networkx библиотекой.), который найдет все минимальные связующие деревья (MST) неориентированного взвешенного графика.
Я могу только найти реализации для Алгоритма Kruskal и Алгоритма Prim, оба из которых только возвратят единственный MST.
Я видел бумаги, которые решают эту проблему (такую как Представление всех минимальных связующих деревьев с приложениями к подсчету и поколению), но моя голова имеет тенденцию взрываться некоторым образом посредством попытки думать, как перевести его для кодирования.
На самом деле я не смог найти реализацию на любом языке!
Не знаю, является ли это решением, но это решение (это графовая версия перебора, я бы сказал):
O(Elog(V) + V + n) для n = количество прямых деревьев
, как я понял из 2 минут гугления, возможно, можно улучшить. Примечание: Делайте это лениво! Генерация всех возможных деревьев и последующая фильтрация результатов займет O(V^2) памяти, а полиномиальные требования к пространству - зло. Сгенерируйте дерево, проверьте его вес, если это MST, добавьте его в список результатов, если нет - отбросьте его.
Общая временная сложность: O(Elog(V) + V + n) для G(V,E) с n охватывающими деревьями