给定两个顶点(A和B)和一个树(G)(无向简单图) - 在G中的A和B之间的简单路径中找到顶点。 该算法应该以O(V)复杂度运行。
例如- 在a和b之间的简单路径中找到顶点:
d<->k
k<->a
k<->b
答案应该是:k
我曾尝试修改BFS以实现目标,但到目前为止它似乎无效。
有什么建议吗?
答案 0 :(得分:2)
如果问题是在找到距离后重建路径,请按以下方式调整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
但是对于从BFS来源D
到目标I
的路径,您将无法在重建期间遇到它们。
重新构建从I
开始的路径时,会得到I<-G
,然后是I<-G<-F
,依此类推,直到您的完整路径反向排列。
如果你只关心一个目标的路径,你可以在发现目标后中止BFS;但这不会改变复杂性。但是,如果您想要从一个源顶点到所有目标的路径,请执行完整的BFS;如果你这样做,前辈将允许你重建任何目标顶点的路径。