我们学院正在学习“高级算法”课程,我们每个人都有一个任务来描述“Java中的算法”一书中的特定算法。我们还必须实现本书中的代码(当然是Java),以展示算法如何在一个具体的例子上工作。
本书中已经提供了我们必须用于图形,节点,边缘等的类,但在我看来(以及其他一些学生),代码中有一些错误会阻止它编译。
我设法找到的唯一实现是: 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(),end()和nxt()方法的实现。出现问题是因为它们返回整数,而不是Edge类的实例。如果我将for循环中的初始化程序更改为“int e ...”,则循环内的代码不起作用,因为它调用“e”对象上的other()和wt()方法。
是否有人可能遇到同样的问题,或者是否有人知道该书中是否有可供下载的工作代码实施?
P.S。允许使用本书中的类,我只需要使用我自己的代码来表示图形,如果类实际工作的话,这根本不会成为问题:)
答案 0 :(得分:0)
如果A.end()返回一个布尔值(或整数0/1),表示它是否在列表的末尾,那么A.beg()可能返回一个布尔值(或整数0) / 1)指定它是否在列表的开头。因此,编写示例代码的人可能与编写Edge代码并且期望beg()函数具有不同功能的人不同。