这是我的数据结构课程的第一个作业的一部分,所以如果你只是告诉我我错在哪里而不是发布工作代码,我会很高兴。
我们应该编写一个程序,给定一个度数序列,绘制一个图形。我为图编写了数据结构,它可以正确连接两个顶点(graph.addConnection)。但我无法找到从度数序列构建图表的方法。
这个维基百科页面给出了一个简单的算法:
- 从没有边的图开始。
- 按照剩余度要求的非递增顺序维护其度要求尚未满足的顶点列表。
- 将第一个顶点连接到此列表中的下一个 d1 顶点,然后将其从列表中删除。重新排序列表并重复,直到满足所有学位要求。
我在 Java 中这样实现它:
public static void populate(Graph graph, int[] degrees) {
class DegreeMapping {
int vertice=0;
int degree=0;
}
ArrayList<DegreeMapping> degrees_ = new ArrayList<DegreeMapping>(degrees.length);
for(int i=0; i<degrees.length; i++) {
degrees_.add(new DegreeMapping());
degrees_.get(i).vertice = i;
degrees_.get(i).degree = degrees[i];
}
while(! degrees_.isEmpty()) {
// Sort by degrees
Collections.sort(degrees_, new Comparator<DegreeMapping>() {
@Override
public int compare(DegreeMapping o1, DegreeMapping o2) {
return o2.degree - o1.degree ;
}
});
for(DegreeMapping i: degrees_) System.out.printf("{%d, #%d} ", i.degree, i.vertice );
System.out.println();
for(int i=1; i<degrees_.get(0).degree+1; i++) {
degrees_.get(i).degree--;
graph.addConnection(degrees_.get(0).vertice, degrees_.get(i).vertice);
System.out.printf("#%d <-> #%d \n", degrees_.get(0).vertice, degrees_.get(i).vertice);
}
degrees_.remove(0);
}
}
它为度数序列提供以下输出2 2 2 2 2 2 2 2
:
{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, #4} {1, #5} {1, #1} {1, #2}
#6 <-> #7
#6 <-> #4
{1, #7} {1, #5} {1, #1} {1, #2} {0, #4}
#7 <-> #5
{1, #1} {1, #2} {0, #5} {0, #4}
#1 <-> #2
{0, #2} {0, #5} {0, #4}
{0, #5} {0, #4}
{0, #4}
如您所见,它创建了两个具有顶点 {0, 1, 2} 和 {3, 4, 5, 6, 7} 的不同组,它们之间没有任何联系。但它应该只创建一个图表。
我究竟做错了什么?