2
我正在使用一個鄰接矩陣,並嘗試創建一個函數,在圖中找到最短路徑。我試圖修改我用來編寫最小生成樹函數的Prim算法。Java中的最短路徑實現
public static int shortest(int first, int last) throws Exception{
int weight[] = new int[Nodes.length]; //keeps track of the weights of the added edges
int path[] = new int[Nodes.length]; //keeps track of the nodes in the path
boolean visited[] = new boolean[Nodes.length]; //keeps track of nodes visited
int current;
int total;
int minWeight;
int nodes = Nodes.length;
int i;
for (i=0;i<nodes;i++){ //initialization
path[i]=0;
visited[i]=false;
weight[i]=32767; //largest short int
}
current=first;
weight[current]=0;
total=1;
visited[current]=true;
path[0]=current;
while(total!=nodes){
for(i=1;i<nodes;i++){
if(AMatrix[current][i] != 0 && visited[i]==false && weight[i]>AMatrix[current][i]){
weight[i]=AMatrix[current][i];
path[i]=current;
}
}
minWeight=32767;
for(i=1;i<nodes;i++){
if(visited[i]==false && weight[i]<minWeight){
minWeight=weight[i];
current=i;
}
}
write("current = "+ current);
visited[current]=true;
total++;
if(current == last){
path[total-1]=current;
for(i=1;i<total;i++){
write("includes the node "+Nodes[path[i]]);
}
minWeight=0;
int j=1;
for(i=2;i<total;i++){
write("The weight from "+Nodes[path[j]]+" to "+Nodes[path[i]]+" is "+AMatrix[path[j]][path[i]]);
minWeight = minWeight+AMatrix[path[j]][path[i]];
write("min weight= "+minWeight);
j++;
}
return minWeight;
}
}
return -1;
}
它的工作原理與我把它那裏,我開始與第一節點的輸入之一,但如果我試着以不同的節點,它創建一個連接未實際連接的兩個節點的路徑。我盯着這麼久,我看不出爲什麼這樣做。最小的生成樹工作得很好,我認爲這將是一個簡單的修改,但它不起作用。
我實際上認爲這樣做有很多錯誤,例如如果我嘗試打印出從0開始的路徑數組元素,它會打印出第一個元素兩次,所以我確信我'我犯了很多錯誤,但那是現在對我來說公然明顯的錯誤。
AMatrix是我的鄰接矩陣,Nodes是我每個節點的矩陣。寫是我寫的功能,寫入輸出文件。
[嘗試通過調試代碼縮小問題範圍](http://codingkilledthecat.wordpress.com/2012/06/26/how-to-ask-for-programming-help/)。這個過程應該可以幫助你自己找到錯誤。如果在縮小範圍後仍無法找到它,其他人可以更輕鬆地爲您提供幫助。 – Domi