检查权重不要总和为0的周期

时间:2017-05-23 17:13:43

标签: java algorithm graph graph-algorithm

我有一个连接图g,其n个顶点和m边。

每条边都可以从两个方向穿过,同时在一个方向上穿过它们,它们的重量是正的,在另一个方向上横穿它们,它们的重量是负的。

因此对于每个边u - >权重为v的{​​{1}}存在边w - >权重为v的{​​{1}}。

我的目标:

对于给定的顶点u,检查是否存在返回-w的路径(一个循环),以使该路径的边权重之和不等于v 。如果存在这样的路径,则输出这种路径的最小边数,否则输出v

示例:

0"all cycles are fine"的所有路径总计为v的示例。输出为v

Example 1

存在从0"all cycles are fine"的路径的示例,其边缘总和为不等于v的值。在此示例中,此路径的最小边数为4:

Example 2

我目前的做法:

查找从顶点v到其自身的所有路径/周期,并检查它们是否总和为0。我在以有效的方式查找所有路径/周期时遇到问题,是否有更优雅的解决方案,还是应该尝试找到最有效的算法来查找所有路径?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,这个问题等同于“对于给定的顶点v,对于任何其他顶点,检查从v到该顶点的所有路径是否具有相同的权重”。

我想你可以通过BFS做到这一点,只需用距离v标记顶点,并检查遍历时是否有不同的距离。

换句话说,由于从起始顶点到某个顶点的所有距离应该相同,因此您可以为每个顶点创建具有该距离的标签。从给定的起始顶点开始,BFS遍历所有顶点。遍历图形时,对于每个顶点v,检查尾部为v的所有边。计算v的标签加上边缘的权重,并获得值xv必须已标记)。对于边的顶点w,有两种可能性:

  1. w未标注。然后使用值w标记x

  2. w已贴上标签。在这种情况下,请比较xw的标签。

    • 如果它们相同,请继续检查。
    • 否则,您有一个边数最小的圆,因为您正在进行BFS。立即停止。
  3. 当选中从v开始的所有边时,转到BFS中的下一个顶点。如果所有顶点都通过了测试,则不存在这样的圆。

    希望这有帮助!