Ответ 1
У вас есть правильная идея, хотя вы можете сделать лучше, чем BFS для поиска кратчайшего пути, если вы правильно сохраните дерево.
Скажите, что один node r в T является корнем (вы можете выбрать любые node и BFS отсюда, чтобы создать эту структуру, если вы пометили ребра дерева в структуре графика матрицы или графства), и каждый другой node имеет родительский указатель и подсчет глубины. Чтобы найти кратчайший путь между a и b в T:
- Пусть a - "глубже" node; при необходимости замените.
- Пройдите по родительским ссылкам с символа a до тех пор, пока не будет достигнуто значение b или r, сохраняя пройденный путь, отмечая посещенные узлы.
- Если вы достигнете b, кратчайший путь будет пройден.
- Если вы достигнете r, то также переходите от b к корню; если вы достигнете node, достигнутого в обход от a до r, остановитесь. Присоединитесь к двум, где они встречаются, и у вас есть кратчайший путь в T.
Доказательство справедливости этого алгоритма остается как упражнение для читателя. Это O (| V |), как BFS, но также будет быстрее. Только несколько конфигураций MST фактически потребуют времени O (| V |) на практике. Разумеется, для генерации дерева родительской ссылки сначала следует время O (| V |), поэтому в некоторых случаях это помогает только в том случае, если вы используете алгоритм построения MST, который естественным образом создает эту структуру в процессе определения MST.
Как сказал еще один комментатор, обратите внимание, что если есть MST для графа, он связан, поэтому | V | <= | E | и, следовательно, O (| V |) < O (| E |).
Кроме того, чтобы исправить дерево в O (| V |), при необходимости, просто найдите самый длинный край цикла и удалите его, заменив его новым краем. Выполнение этого эффективно с помощью MST родительского канала также является упражнением для читателя.