[英]Finding simple path between two vertices in a tree (undirected simple graph)
给定两个顶点(A和B)和一个树(G)(无向简单图) - 在G中的A和B之间的简单路径中找到顶点。算法应该以O(V)复杂度运行。
例如 - 在a和b之间的简单路径中找到顶点:
d<->k
k<->a
k<->b
答案应该是:k
我试图修改BFS来实现目标,但到目前为止似乎没有用。
有什么建议么?
如果问题是在找到距离后重建路径,请按以下方式调整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; 如果你这样做,前辈将允许你重建任何目标顶点的路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.