Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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/10.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 使用度序列创建图_Java_Algorithm_Language Agnostic_Graph Theory - Fatal编程技术网

Java 使用度序列创建图

Java 使用度序列创建图,java,algorithm,language-agnostic,graph-theory,Java,Algorithm,Language Agnostic,Graph Theory,这是我的数据结构课程的第一个作业的一部分,所以如果你能告诉我哪里错了,而不是发布一个工作代码,我会很高兴的 我们应该写一个程序,给定一个度序列,画一个图。我为图编写了数据结构,它可以正确连接两个顶点(graph.addConnection)。但是我找不到一种从度序列构建图表的方法 给出了一个简单的算法: 从一个没有边的图开始 以剩余度要求的非递增顺序维护尚未满足度要求的顶点列表 将第一个顶点连接到此列表中的下一个d1顶点,然后将其从列表中删除。重新排序列表并重复,直到所有 达到学位要求 我用Ja

这是我的数据结构课程的第一个作业的一部分,所以如果你能告诉我哪里错了,而不是发布一个工作代码,我会很高兴的

我们应该写一个程序,给定一个度序列,画一个图。我为图编写了数据结构,它可以正确连接两个顶点(graph.addConnection)。但是我找不到一种从度序列构建图表的方法

给出了一个简单的算法:

  • 从一个没有边的图开始
  • 以剩余度要求的非递增顺序维护尚未满足度要求的顶点列表
  • 将第一个顶点连接到此列表中的下一个d1顶点,然后将其从列表中删除。重新排序列表并重复,直到所有 达到学位要求
  • 我用Java实现了它,如下所示:

    publicstaticvoid填充(图形,int[]度){
    类度映射{
    int-vertice=0;
    整数度=0;
    }
    ArrayList度=新的ArrayList(度.长度);
    
    对于(inti=0;i而言,如果同时对顶点数进行排序,则效果似乎更好

    // Sort by degrees and then vertex number
    Collections.sort(degrees_, new Comparator<DegreeMapping>() {
        @Override
        public int compare(DegreeMapping o1, DegreeMapping o2) {
            if (o1.degree == o2.degree) return o2.vertice - o1.vertice;
            return o2.degree - o1.degree;
        }
    });
    
    //按度排序,然后按顶点编号排序
    Collections.sort(度,新比较器(){
    @凌驾
    公共整数比较(度数映射o1,度数映射o2){
    如果(o1.degree==o2.degree),则返回o2.vertice-o1.vertice;
    返回o2.degree-o1.degree;
    }
    });
    
    结果:

    {2, #0}, {2, #1}, {2, #2}, {2, #3}, {2, #4}, {2, #5}, {2, #6}, {2, #7}
    #0 <-> #1
    #0 <-> #2
    {2, #3}, {2, #4}, {2, #5}, {2, #6}, {2, #7}, {1, #1}, {1, #2}
    #3 <-> #4
    #3 <-> #5
    {2, #6}, {2, #7}, {1, #1}, {1, #2}, {1, #4}, {1, #5}
    #6 <-> #7
    #6 <-> #1
    {1, #2}, {1, #4}, {1, #5}, {1, #7}, {0, #1}
    #2 <-> #4
    {1, #5}, {1, #7}, {0, #1}, {0, #4}
    #5 <-> #7
    {0, #7}, {0, #1}, {0, #4}
    {0, #1}, {0, #4}
    {0, #4}
    
    {2,0},{2,1},{2,2},{2,3},{2,4},{2,5},{2,6},{2,7}
    #0  #1
    #0  #2
    {2, #3}, {2, #4}, {2, #5}, {2, #6}, {2, #7}, {1, #1}, {1, #2}
    #3  #4
    #3  #5
    {2, #6}, {2, #7}, {1, #1}, {1, #2}, {1, #4}, {1, #5}
    #6  #7
    #6  #1
    {1, #2}, {1, #4}, {1, #5}, {1, #7}, {0, #1}
    #2  #4
    {1, #5}, {1, #7}, {0, #1}, {0, #4}
    #5  #7
    {0, #7}, {0, #1}, {0, #4}
    {0, #1}, {0, #4}
    {0, #4}
    

    根据Mihail和Vishnoi的论文,可以通过修改算法的结果来创建连通图

    如果该图被证明是未连接的,则其中一个连接的组件必须包含一个循环。设(u,v)为循环中的任何边,而设(s,t)为另一个连接组件中的边。显然,该图在对u,s和v,t之间没有边。通过移除边(u,v)和(s,t),并插入边(u,s)和(v,t),我们合并这两个组件。注意,得到的图仍然满足给定的度序列。按照这种方式,我们可以得到一个连通拓扑


    如果同时按顶点数排序,效果似乎更好

    // Sort by degrees and then vertex number
    Collections.sort(degrees_, new Comparator<DegreeMapping>() {
        @Override
        public int compare(DegreeMapping o1, DegreeMapping o2) {
            if (o1.degree == o2.degree) return o2.vertice - o1.vertice;
            return o2.degree - o1.degree;
        }
    });
    
    //按度排序,然后按顶点编号排序
    Collections.sort(度,新比较器(){
    @凌驾
    公共整数比较(度数映射o1,度数映射o2){
    如果(o1.degree==o2.degree),则返回o2.vertice-o1.vertice;
    返回o2.degree-o1.degree;
    }
    });
    
    结果:

    {2, #0}, {2, #1}, {2, #2}, {2, #3}, {2, #4}, {2, #5}, {2, #6}, {2, #7}
    #0 <-> #1
    #0 <-> #2
    {2, #3}, {2, #4}, {2, #5}, {2, #6}, {2, #7}, {1, #1}, {1, #2}
    #3 <-> #4
    #3 <-> #5
    {2, #6}, {2, #7}, {1, #1}, {1, #2}, {1, #4}, {1, #5}
    #6 <-> #7
    #6 <-> #1
    {1, #2}, {1, #4}, {1, #5}, {1, #7}, {0, #1}
    #2 <-> #4
    {1, #5}, {1, #7}, {0, #1}, {0, #4}
    #5 <-> #7
    {0, #7}, {0, #1}, {0, #4}
    {0, #1}, {0, #4}
    {0, #4}
    
    {2,0},{2,1},{2,2},{2,3},{2,4},{2,5},{2,6},{2,7}
    #0  #1
    #0  #2
    {2, #3}, {2, #4}, {2, #5}, {2, #6}, {2, #7}, {1, #1}, {1, #2}
    #3  #4
    #3  #5
    {2, #6}, {2, #7}, {1, #1}, {1, #2}, {1, #4}, {1, #5}
    #6  #7
    #6  #1
    {1, #2}, {1, #4}, {1, #5}, {1, #7}, {0, #1}
    #2  #4
    {1, #5}, {1, #7}, {0, #1}, {0, #4}
    #5  #7
    {0, #7}, {0, #1}, {0, #4}
    {0, #1}, {0, #4}
    {0, #4}
    

    根据Mihail和Vishnoi的论文,可以通过修改算法的结果来创建连通图

    如果该图被证明是未连接的,则其中一个连接的组件必须包含一个循环。设(u,v)为循环中的任何边,而设(s,t)为另一个连接组件中的边。显然,该图在对u,s和v,t之间没有边。通过移除边(u,v)和(s,t),并插入边(u,s)和(v,t),我们合并这两个组件。注意,得到的图仍然满足给定的度序列。按照这种方式,我们可以得到一个连通拓扑


    根据维基百科的说法,该算法生成一个简单的图,同样根据维基百科的说法,它是“一个无向图,在任何两个不同的顶点之间没有循环,也没有超过一条边”

    您得到的是一个包含两个不同连接组件的图,而不是两个图,因此该算法似乎工作正常


    如果你的作业没有明确说明图形应该连接,你就不用担心了。

    根据维基百科的说法,该算法生成一个简单的图形,同样根据维基百科的说法,它是“一个无向图,在任何两个不同的顶点之间没有循环,也没有超过一条边”

    您得到的是一个包含两个不同连接组件的图,而不是两个图,因此该算法似乎工作正常


    如果您的作业没有明确说明图形应该连接,您不必担心。

    它修复了特定的输入,但仍然失败,例如:
    3 3 3 1 1 1 1 1
    它修复了特定的输入,但仍然失败,例如:
    3 3 3 1 1 1 1 1
    不幸的是,我的作业说明了它。那么,我应该整个算法,你能建议什么吗?也许你可以考虑一个将所有顶点连接在一起的路径,从度序列中的每个元素中减去1,然后继续进行算法。但是,如果我没有正确的顺序加入所有的顶点,那么它们就不会形成一个图吗?我以前的评论是,当你通过图表时,你不应该把已经连接的顶点看作是边添加的候选。你所说的“没有正确的顺序”是什么意思??如果你在当前顶点和下一个顶点之间添加一条边,你将得到一条包含所有顶点的路径。我认为除了执行该操作的顺序外,没有其他顺序需要考虑