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,存储所有“坏圈”大小,并输出最小值。