2011-12-18 50 views
0

我們在我的大學有一個「高級算法」課程和我們每個人得到了一個分配描述從「使用Java語言算法」的具體算法書。我們還必須實現本書中的代碼(當然是Java),以顯示算法如何在具體示例上工作。補充代碼「在Java中的算法,第5部分」一書(塞奇威克)

本書中已經提供了我們必須用於圖形,節點,邊等的類,但在我看來(和其他一些學生),代碼有一些錯誤會阻止它編譯。

我設法找到的唯一實現是這樣的: http://www.cs.princeton.edu/~rs/Algs3.java5/code.txt 但是,這是與本書相同的代碼,它不起作用。

我在遇到問題的代碼是在這裏:

GraphSPT(Graph G, int s) 
    { int V = G.V(), N = 0; 
    wt = new double[V]; spt = new Edge[V]; 
    for (int v = 0; v < V; v++) wt[v] = maxWT; 
    intQueue Q = new intQueue(G.E()); 
    wt[s] = 0.0; Q.put(s); Q.put(V); 
    while (!Q.empty()) 
    { int v; 
     while ((v = Q.get()) == V) 
     { if (N++ > V) return; Q.put(V); } 
     AdjList A = G.getAdjList(v); 
     for (Edge e = A.beg(); !A.end(); e = A.nxt()) /* this line is the one with the problem */ 
     { int w = e.other(v); 
      double P = wt[v] + e.wt(); 
      if (P < wt[w]) 
      { wt[w] = P; Q.put(w); spt[w] = e; } 
     } 
    } 
    } 

標誌着我有問題的線。 AdjList中前行是一個接口,但getAdjList()方法返回AdjLinkedList類,其中包含BEG(),結束()和NXT()方法的實現方式中的一個實例。發生該問題是因爲它們返回整數,而不是Edge類的實例。如果我將for循環中的初始化程序更改爲「int e ...」,那麼循環內的代碼不起作用,因爲它調用了「e」對象上的other()和wt()方法。

是否有人有同樣的問題,也許,還是沒有人知道是否有可供下載從書中的任何工作代碼實現?

P.S.從書中使用類是允許的,我只是代表我自己的代碼圖表其不會在所有如果類實際工作中的問題:)

+0

什麼是「問題」?你有錯誤信息嗎? – birryree 2011-12-18 00:11:19

+0

@birryree是的,循環初始化中的「Edge e」需要來自A.beg()的Edge對象,而不是「int」。我可以在明天發佈輸出結果(我現在不在我的機器上)。 – 2011-12-18 00:15:30

+0

A.beg()是如何定義的? – Kevin 2011-12-18 00:26:15

回答

0

如果A.end()返回一個布爾值(或整數0/1)表示它是否在列表的末尾,那麼A.beg()可能會返回一個布爾值(或一個整數0/1),指定它是否在列表的開始位置。因此,編寫示例代碼的人可能不是編寫Edge代碼並且期望從beg()函數獲得不同功能的人。

+0

誰知道......最後,我們的教授接受了算法的理論解釋,讓我們通過。 謝謝大家的幫助,無論如何! – 2012-01-28 20:05:37