這是我的數據結構課程的第一個任務的一部分,所以如果你只是告訴我我錯在哪裏而不是發佈工作代碼,我會很高興。使用度數序列創建圖形
我們應該編寫一個給定度數序列的程序,繪製一張圖。我爲圖形寫了數據結構,它可以正確地連接兩個頂點(graph.addConnection)。但是我無法找到一種方法來根據學位順序構建圖表。
This Wikipedia page給出了一個簡單的算法:
- 開始與沒有條邊的圖。
- 保持尚未達到殘差等級要求不升序的程度要求的頂點列表。
- 將第一個頂點連接到此列表中的下一個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}的組,它們之間沒有任何連接。但它應該只創建一個圖。
我在做什麼錯?
不幸的是,我的任務說明了它。那麼,我應該改變整個算法嗎?你能提出什麼建議嗎? – utdemir
也許您可以考慮將所有頂點連接在一起的路徑,從度數序列中的每個元素中減去1,然後繼續執行算法。 – broncoAbierto
但是沒有這種可能性;如果我沒有正確的順序連接所有的頂點,其餘的將不會形成圖形? – utdemir