我有一个连接图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
。我在以有效的方式查找所有路径/周期时遇到问题,是否有更优雅的解决方案,还是应该尝试找到最有效的算法来查找所有路径?
答案 0 :(得分:3)
如果我理解正确,这个问题等同于“对于给定的顶点v,对于任何其他顶点,检查从v到该顶点的所有路径是否具有相同的权重”。
我想你可以通过BFS做到这一点,只需用距离v标记顶点,并检查遍历时是否有不同的距离。
换句话说,由于从起始顶点到某个顶点的所有距离应该相同,因此您可以为每个顶点创建具有该距离的标签。从给定的起始顶点开始,BFS遍历所有顶点。遍历图形时,对于每个顶点v
,检查尾部为v
的所有边。计算v
的标签加上边缘的权重,并获得值x
(v
必须已标记)。对于边的顶点w
,有两种可能性:
w
未标注。然后使用值w
标记x
。
w
已贴上标签。在这种情况下,请比较x
和w
的标签。
当选中从v
开始的所有边时,转到BFS中的下一个顶点。如果所有顶点都通过了测试,则不存在这样的圆。
希望这有帮助!