Если я правильно понимаю ваш вопрос, то вы ищете минимальное связующее дерево (часто сокращенно MST). MST - это просто подмножество путей, которые
- (a) соединяют все точки,
- (b) имеет наименьшую общую длину, возможную при этом, и
- (c) не имеет циклов.
Существует несколько известных алгоритмов, которые могут найти MST, таких как алгоритм Прима и алгоритм Крускала - я проведу вас через алгоритм Крускала, который я считаю наиболее интуитивным. Если вам интересно, вы сможете найти дополнительные алгоритмы онлайн или в учебниках по алгоритмам.
Крускала начинается с сортировки отдельных путей по длине. Используя этот список, мы можем затем создать MST, повторяя следующий процесс, пока все точки / вершины не будут включены в наше дерево:
- Рассмотрим кратчайший путь в списке.
- Если это создаст цикл в вашем MST, не добавляйте его в дерево (просто удалите его из списка).
- В противном случае добавьте его в дерево (и удалите его из списка).
В итоге вы получите дерево, которое
- (a) соединяет все точки - гарантировано, так как рассматривается каждый путь, каждая вершина право на участие в MST должно быть на пути, и добавление пути для достижения ранее не связанной вершины не может создать цикл;
- (b) имеет наименьшую возможную общую длину - гарантируется, поскольку пути добавляются в порядке возрастания длины; и
- (c) не имеет циклов - гарантировано, потому что алгоритм явно избегает этого.
Примечания:
(1) При работе с MST (и другими проблемами с графами) мы часто называем детали по заданным c именам: набор точек «график», указанная c точка или узел - это «вершина», пути между вершинами являются «ребрами», а длины ребер - «весами».
(2) Алгоритм Крускала выполняется за время O (ElogV), где E - количество путей / ребер, а V - количество точек / вершин.
(3) Если у вашего графа есть какие-либо вершины или наборы вершин, которые отключены от остальной части набора данных, вы получите несколько MST в «лесу MST».
(4) График может иметь более одного MST; например, в на этом графике минимальная длина MST равна 6 - что достигается обоими из следующих MST: MST1 , MST2
(5) Определить, может ли добавление пути создать цикл, действительно сложно; Один из способов сделать это - использовать структуру данных UnionFind, с которой вы можете поиграть здесь .