我正在使用Adjacency矩阵并尝试创建一个在图中找到最短路径的函数。我正在尝试修改我用来编写最小生成树函数的Prim算法。
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是我的邻接矩阵,节点是我每个节点的矩阵。 Write是我编写的写入输出文件的函数。
答案 0 :(得分:1)
数组具有零基索引。但是你的前两个循环从1开始:
for(i = 1; i&lt; nodes; i ++)
因此,这可能会导致它在您启动first=0
时起作用,因为在您的邻接矩阵AMatrix[current][i] != 0
中,对角线(当前== i)可能为0.但是如果您启动算法如果其他值为0,则表示缺少节点:0。
另外,只是一些提示:
weight[i] = Short.MAX_VALUE;