我有一个连接图g
,其n
个顶点和m
边。
每条边都可以从两个方向穿过,同时在一个方向上穿过它们,它们的重量是正的,在另一个方向上横穿它们,它们的重量是负的。
因此对于每个边u
- >权重为v
的{{1}}存在边w
- >权重为v
的{{1}}。
我的目标:
对于给定的顶点u
,检查是否存在返回-w
的路径(一个循环),以使该路径的边权重之和不等于v
。如果存在这样的路径,则输出这种路径的最小边数,否则输出v
。
示例:
从0
到"all cycles are fine"
的所有路径总计为v
的示例。输出为v
:
存在从0
到"all cycles are fine"
的路径的示例,其边缘总和为不等于v
的值。在此示例中,此路径的最小边数为4:
我目前的做法:
问题似乎等同于检查从给定顶点v
到任何其他顶点0
的所有路径是否具有相等的长度,如果这是真的那么"所有循环都很好& #34;否则我输出破坏条件的最短周期的长度。我很难找到一种有效的算法来测试这种情况。
答案 0 :(得分:3)
检查是否存在"错误循环的简单算法"通过顶点A的是从A运行BFS,然后以不同的成本查看哪些顶点B至少访问了两次。如果不存在B,那么所有循环都是好的,否则存在大小不良的循环(直到第一次访问B的边缘)+(边缘直到以不同的成本访问B)。这个BFS最多访问每个顶点两次,因此复杂性仍然是线性的。
因此,这个问题可以通过图中每个顶点的BFS来解决。当然,也许这可以提高效率;什么是足够的取决于n和m的大小。