Если проблема заключается в восстановлении пути после того, как вы нашли расстояние, настройте BFS следующим образом: начните с одной из двух вершин, которые вы хотите соединить, выполните BFS. Для каждой обнаруженной вами вершины v
сохраните ее предшественницу: если вы обнаружите вершину w
через ребро u->w
, то предшественником w
будет u
. После этого вы можете реконструировать путь в обратном порядке, начиная с целевой вершины и переходя от предшественника к предшественнику, пока не достигнете исходной вершины.
Пример:
J
\
\
A
/ \
/ \
B C
/ \ \
/ \ \
D E F
/ \
/ \
G H
\
\
I
Если вы вычисляете путь от D
до I
, то у вас есть следующие предшественники:
pre[I]=G
pre[G]=F
pre[F]=C
pre[C]=A
pre[A]=B //A was discovered during the BFS via the edge B->A, so pre[A]=B
pre[B]=D
У вас также будут некоторые предшественники, которые не лежат на вашем пути, поэтому они не будут иметь значения во время реконструкции. В примере у вас также будет
pre[J]=A
pre[E]=B
pre[H]=F
но для пути от источника БФС D
до цели I
вы их не встретите при реконструкции.
Когда вы восстанавливаете путь, начинающийся с I
, вы получаете I<-G
, затем I<-G<-F
и так далее, пока не получите полный путь в обратном порядке.
Если вас интересует только путь к одной цели, вы можете прервать BFS, как только вы обнаружите цель; это не изменит сложность, хотя. Однако, если вам нужны пути ко всем целям из одной исходной вершины, выполните полную BFS; если вы это сделаете, предшественники позволят вам восстановить путь к любой целевой вершине.
person
G. Bach
schedule
29.03.2013