Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 无向(多)图(Hierholzers算法)_Java_Algorithm_Arrays_Loops - Fatal编程技术网

Java 无向(多)图(Hierholzers算法)

Java 无向(多)图(Hierholzers算法),java,algorithm,arrays,loops,Java,Algorithm,Arrays,Loops,我非常坚持使用循环结构来绘制我的图,以完成Eulers巡回 这是我正在绘制的图表,记住它是无向的,所以从N1到N4的旅程与从N4到N1的旅程是一样的(并不意味着光顾只是为了增加我获得帮助的机会) 解决这个问题的方法是找到一个封闭的旅行团集合。然后,如果每条线都被使用了,并且我们已经找到了一组闭合的回路,那么欧拉回路就被找到了 这是我正在处理的图形的图像以及2d数组表示 正如您在我可爱的图像旁边看到的,有一个2d int数组,表示顶点之间的边。我的问题是创建一个循环,该循环在运行时将转到任何顶点

我非常坚持使用循环结构来绘制我的图,以完成Eulers巡回

这是我正在绘制的图表,记住它是无向的,所以从N1到N4的旅程与从N4到N1的旅程是一样的(并不意味着光顾只是为了增加我获得帮助的机会)

解决这个问题的方法是找到一个封闭的旅行团集合。然后,如果每条线都被使用了,并且我们已经找到了一组闭合的回路,那么欧拉回路就被找到了

这是我正在处理的图形的图像以及2d数组表示

正如您在我可爱的图像旁边看到的,有一个2d int数组,表示顶点之间的边。我的问题是创建一个循环,该循环在运行时将转到任何顶点,并在起点处结束(对于闭合巡更)。必须有一个数学的,逻辑的方法来做到这一点

我想我需要绕一条线。如果矩阵[column][row]>0(即存在链接),那么矩阵[row][column]--将删除一个链接,但我仍然不确定这将如何帮助我收集封闭巡演的链接

对此我真的很抱歉。我已经尽我所能解释了我的问题,如果你需要更多的信息来尝试和帮助,请告诉我

谢谢

  • 检查词汇表顶点(复数:顶点/顶点)也被称为节点。顶点之间的连接称为边。你在对数组的描述中混淆了这一点
  • 二维数组称为“邻接矩阵”,严格来说,图像中的数组是无效的,因为缺少多个值
  • 在尝试计算Euler漫游之前,您可以进行一些健全性检查
健康检查

  • 检查所有顶点是否具有偶数阶
  • 检查图形是否已连接
  • 如果这两个检查中有一个失败,则图形不能包含Euler巡更。否则,如果两个检查都通过,则图形是欧拉图

    例如,您提供的图形不能包含Euler漫游,因为N2和N4的度数不均匀。。您的图像与提供的邻接矩阵不同(忽略了这一点)。基于邻接矩阵提供的图形包含euler漫游

    其他方法如下:

    Be G=(V,E)你的图是连通的,并且只包含偶数度的顶点

  • 从G中选择任意顶点x
  • 从G中的x开始创建有效的Euler漫游K1(仅使用所有边E的子集)
  • 删除K1使用的所有边
  • 从K1中选择一个度仍然大于0的顶点y
  • 从E中剩余边子集的y开始构造另一个Euler漫游Kn
  • 重复此操作,直到使用了边缘
  • 现在,您可以从找到的第一个“sub”-Euler tour K1开始,并包括在相应交点上找到的其他“sub”-Euler tour,从而获得Euler tour
  • e、 g.给定表示g的邻接矩阵,我们可以在Euler tour(名称为H)上找到g

    1.)从V1=x开始

    2.)K1=(V1,V3,V1)

    3.)从G上移除K1中的边缘

    更新邻接矩阵

       V1 V2 V3 V4 V5
    V1  0  0  0  0  0
    V2  0  0  1  1  2
    V3  0  1  0  1  0
    V4  0  1  1  0  0
    V5  0  2  0  0  0
    
       V1 V2 V3 V4 V5
    V1  0  0  0  0  0
    V2  0  0  0  0  2
    V3  0  0  0  0  0
    V4  0  0  0  0  0
    V5  0  2  0  0  0
    
    4.)V3=y(在K1中,度=2)

    5.)K2=(3,4,2,3)

    3.)移除K2边缘

    更新邻接矩阵

       V1 V2 V3 V4 V5
    V1  0  0  0  0  0
    V2  0  0  1  1  2
    V3  0  1  0  1  0
    V4  0  1  1  0  0
    V5  0  2  0  0  0
    
       V1 V2 V3 V4 V5
    V1  0  0  0  0  0
    V2  0  0  0  0  2
    V3  0  0  0  0  0
    V4  0  0  0  0  0
    V5  0  2  0  0  0
    
    4.)V2=y(在K2中,度=2

    5.)K3=(2,5,2)

    6.)使用所有边缘

    7.)从x=V1开始,我们构建H

    H=(1,3

    在这里,第一个交叉点与另一个“子”-欧拉旅行(K2)发生,我们将其包括在内

    H=(1,3,4,2

    另一个交叉口(K3)我们也包括这个交叉口

    H=(1,3,4,2,5,2

    我们包括了整个行程,并继续我们之前的行程(K2)

    H(1,3,4,2,5,2,3

    在这里,K2结束,我们回到K1之旅,并遵循这一点

    H=(1,3,4,2,5,2,3,1)

    完成。找到了欧拉之旅


    因此,您可以看到,您提到的算法不能仅通过简单的数组循环来实现。您需要保存一些状态信息,即您已经使用了哪些边,以及您已经找到了哪些“sub”-Euler tours。

    实际上,他可能能够找到一条Euler路径(只使用所有边一次),而不是tours(或回路,仅使用一次全部并返回起点)只要不均匀度顶点的数量最多为2。此外,邻接矩阵包括N2和N4之间的边,这将使所有顶点度均匀…谢谢。没有注意到他没有在图像中绘制的N2-N4边。他谈到了euler路径,所以我假设他知道euler路径是什么以及与路径/循环的区别尤特。