Java 使用度序列创建图
这是我的数据结构课程的第一个作业的一部分,所以如果你能告诉我哪里错了,而不是发布一个工作代码,我会很高兴的 我们应该写一个程序,给定一个度序列,画一个图。我为图编写了数据结构,它可以正确连接两个顶点(graph.addConnection)。但是我找不到一种从度序列构建图表的方法 给出了一个简单的算法:Java 使用度序列创建图,java,algorithm,language-agnostic,graph-theory,Java,Algorithm,Language Agnostic,Graph Theory,这是我的数据结构课程的第一个作业的一部分,所以如果你能告诉我哪里错了,而不是发布一个工作代码,我会很高兴的 我们应该写一个程序,给定一个度序列,画一个图。我为图编写了数据结构,它可以正确连接两个顶点(graph.addConnection)。但是我找不到一种从度序列构建图表的方法 给出了一个简单的算法: 从一个没有边的图开始 以剩余度要求的非递增顺序维护尚未满足度要求的顶点列表 将第一个顶点连接到此列表中的下一个d1顶点,然后将其从列表中删除。重新排序列表并重复,直到所有 达到学位要求 我用Ja
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,然后继续进行算法。但是,如果我没有正确的顺序加入所有的顶点,那么它们就不会形成一个图吗?我以前的评论是,当你通过图表时,你不应该把已经连接的顶点看作是边添加的候选。你所说的“没有正确的顺序”是什么意思??如果你在当前顶点和下一个顶点之间添加一条边,你将得到一条包含所有顶点的路径。我认为除了执行该操作的顺序外,没有其他顺序需要考虑