Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查重量不小于'的循环;t总计为0_Java_Algorithm_Graph_Graph Algorithm - Fatal编程技术网

Java 检查重量不小于'的循环;t总计为0

Java 检查重量不小于'的循环;t总计为0,java,algorithm,graph,graph-algorithm,Java,Algorithm,Graph,Graph Algorithm,我有一个连通图g,它有n顶点和m边 可以从两个方向遍历每条边,在一个方向遍历时,其权重为正,在另一个方向遍历时,其权重为负 因此,对于每个边u->v和权重w存在一个边v->u和权重-w 我的目标: 对于给定顶点v,检查是否存在返回v(一个循环)的路径,以便该路径的边权重之和不等于0。如果存在此路径,则输出此路径的最小边数,否则输出“所有循环都正常” 示例: 一个示例,其中从v到v的所有路径总和为0。输出为“所有循环正常”: 一个示例,其中存在从v到v的路径,其边总和不等于0。在本例中,此类路径

我有一个连通图
g
,它有
n
顶点和
m

可以从两个方向遍历每条边,在一个方向遍历时,其权重为正,在另一个方向遍历时,其权重为负

因此,对于每个边
u
->
v
和权重
w
存在一个边
v
->
u
和权重
-w

我的目标:

对于给定顶点
v
,检查是否存在返回
v
(一个循环)的路径,以便该路径的边权重之和不等于
0
。如果存在此路径,则输出此路径的最小边数,否则输出
“所有循环都正常”

示例:

一个示例,其中从
v
v
的所有路径总和为
0
。输出为“所有循环正常”:

一个示例,其中存在从
v
v
的路径,其边总和不等于
0
。在本例中,此类路径的最小边数为4:

我当前的方法:


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

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

我想你们可以用BFS来做,只要用距离v的距离来标记顶点,然后检查遍历时是否有不同的距离

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

  • w
    未标记。然后用值
    x
    标记
    w

  • w
    已被标记。在这种情况下,比较
    x
    w
    的标签

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


    希望这有帮助

    有趣的想法是,从
    v
    到顶点
    w
    的所有路径应该具有相同的长度,因为如果有两条路径的长度从
    v
    w
    不同,我们可以使用一条路径到达
    w
    ,另一条路径返回
    v
    ,由于我们假设两条路径的长度不同,因此边权重之和必须不等于0。现在到第二部分,目标是检查从
    v
    到每个顶点
    w
    的所有路径是否具有相同的长度,您能否详细说明如何通过使用BFS实现这一点?好的,我理解我们如何检查BFS中不等于0的循环,我不明白的是,我如何才能确保圆的边数最少?如何确定最小圆的长度(边权重之和)?通过使用BFS,您可以知道从起始顶点到当前顶点的边数。在这种情况下,可以创建另一个标签
    n
    :从起始顶点开始的边数最少。如上所述,当遇到一个距离不同的顶点
    w
    时,有一个圆的边数是两部分的总和:
    n
    w和从起点到
    v
    的边数。第二部分必须是最小的,因为我们正在做BFS。对于第一部分,尝试所有可能的
    w
    并选择一个最小值。您描述的算法适用于几乎所有情况,有些情况下顶点的遍历顺序很重要(在找到“坏圆”后立即停止会产生错误答案)。我的最终解决方案执行完整的BFS,存储所有“坏圈”大小,并输出最小值。