Я работаю с матрицей Adjacency и пытаюсь создать функцию, которая находит кратчайший путь в графе. Я пытаюсь изменить алгоритм Prim, который я использовал для записи минимальной функции spanning tree.Кратчайший путь реализации в 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 - матрица каждого из моих узлов. Запись - это функция I, которую я написал, что записывает в выходной файл.
[Попробуйте сузить проблему, отлаживая код] (http://codingkilledthecat.wordpress.com/2012/06/26/how-to-ask-for-programming-help/). Этот процесс должен помочь вам найти ошибку самостоятельно. Если вы все еще не можете найти его после сужения, другие люди могут помочь вам гораздо легче. – Domi