我有一个连通的图 g
,有 n
个顶点和 m
条边。
每条边都可以从两个方向遍历,在一个方向上遍历时它们的权重为正,而在另一个方向上遍历时它们的权重为负。
因此,对于每条边 u
-> v
权重为 w
,都存在一条边 v
-> u
权重为 -w
。
我的目标:
对于给定的顶点 v
,检查是否存在一条返回到 v
的路径(一个循环),使得该路径的边权之和不等于 0
。如果存在这样的路径,则输出该路径的最小边数,否则输出 "all cycles are fine"
。
示例:
一个所有从 v
到 v
的路径都加起来等于 0
的示例。输出为 "all cycles are fine"
:
v
到v
的路径,其边缘之和不等于0
。这样一条路径的最小边数为4:
我的当前方法:
查找从顶点v
到自身的所有路径/循环,并检查它们是否全部加起来等于0
。我在高效地查找所有路径/循环方面遇到了问题,是否有更优雅的解决方案,或者我应该尝试找到查找所有路径最有效的算法?
v
到顶点w
的所有路径应该具有相同的长度,因为如果存在两条不同长度的从v
到w
的路径,我们可以使用其中一条路径到达w
,另一条路径返回v
,由于我们假设这两条路径的长度不同,所以边权重之和必须不等于0。现在来看第二部分,目标是检查从v
到每个顶点w
的所有路径是否具有相同的长度,您能否详细说明如何通过使用BFS来实现这一目标? - PlsWorkn
:从起始顶点到当前顶点的最小边数。当您遇到具有不同距离的顶点w
时,如上所述,您将拥有一个圆,其边数是两部分之和:w
的n
和从起始点到v
的边数。第二部分必须是最小的,因为我们正在进行BFS。对于第一部分,请尝试所有可能的w
并选择最小的一个。 - aleph0