编程语言
首页 > 编程语言> > java-检查权重不等于0的循环

java-检查权重不等于0的循环

作者:互联网

我有一个具有n个顶点和m个边的连通图g.

可以从两个方向遍历每个边,而在一个方向上遍历它们的权重为正,在另一个方向上遍历它们的权重为负.

因此,对于每个边缘,u->具有权重w的v存在边v->你的体重-w.

我的目标:

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

例子:

一个示例,其中从v到v的所有路径总计为0.输出为“所有周期都很好”:

Example 1

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

Example 2

我目前的做法:

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

解决方法:

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

我想您可以通过BFS做到这一点,只需用与v的距离标记顶点,然后检查遍历时是否存在不同的距离.

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

> w未标记.然后用值x标记w.
> w已被标记.在这种情况下,将x与w的标签进行比较.

>如果它们相同,请继续检查.
>否则,由于正在执行BFS,因此您的圆的边数最少.立即停止.

检查从v开始的所有边时,转到BFS中的下一个顶点.如果所有顶点都通过了测试,则不存在这样的圆.

希望这可以帮助!

标签:graph,graph-algorithm,java,algorithm
来源: https://codeday.me/bug/20191111/2019201.html