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