[英]Dijkstra Algorithm erroneous implementation for undirected graph
我正在嘗試實現Dijkstra算法,以使用此偽代碼在無向加權圖中找到從起始頂點到所有其他頂點的最短路徑:
Initialize D(v) = 0 and D(u) = ∞ for u != v
Initialize priority queue Q of vertices using D as key.
while Q is not empty do
u = Q.removeMin()
for each vertex z adjacent to u and in Q do
if D(u) + w((u, z)) < D(z) then
D(z) = D(u) + w((u, z))
update z in Q
return D
從這里: http : //www.csl.mtu.edu/cs2321/www/newLectures/30_More_Dijkstra.htm
這是它的實現:
public void Dijkstra(int start) {
int[] D = new int[E.length];
for (int i = 0; i < E.length; i++) {
D[i] = Integer.MAX_VALUE;
}
D[start] = 0;
PriorityQueue<Integer> Q = new PriorityQueue<>();
Q.add(start);
while (!Q.isEmpty()) {
Integer u = Q.poll();
System.out.println(u + " ");
for (int z = 0; z < E[u].size(); z++) {
Edge e = E[u].get(z);
if ((D[u] + e.w) < D[e.v]) {
D[e.v] = D[u] + e.w;
Q.add(e.v);
}
}
}
System.out.println(D[E.length - 1]);
}
該圖是使用鄰接表實現的,此處代碼D(u)中u與v的距離為E.length是鄰接表的長度,而w是邊的權重。 對於此示例:5個頂點,6條邊和一對邊的權重為0 1 20、0 2 20、0 4 40、1 3 50、2 3 30和3 4 70的輸出。 1應該是:1 0 2 3 4和距離140,但是我的實現產生輸出:1 3 4和距離120。我的問題是為什么我在實現中得到這個答案而不是正確的答案。 如果需要課程的其他部分,我會發布它們。 感謝您的閱讀和幫助!
我認為您並沒有找到所有聯系。 例如,您有0 1條邊,因此應添加1 0條邊進行設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.