У меня проблемы с правильной работой алгоритма моего кратчайшего пути. У меня есть 2d-массив 20 x 20, который содержит граничные веса, представляющие дороги между городами. Я не получаю правильных результатов для кратчайшего пути между городами. Будем очень благодарны любой помощи.Самый короткий путь между двумя точками в взвешенном 2d массиве
Мой 2-й массив выглядит так: X-Axis = города 1-20, ось y = города 1-20.
X 732 X 212 X X X X X X X X X X X X X X 36 X
66 X X X X X X X 111 X X 29 X X X X 65 X 14 X
390 17 X X X X X X 11 X 38 X X 122 X X 211 78 X X
X X 273 X 29 X X X X X X 42 X X X X X X X X
X X X 122 X X X X 32 X X X X X X 12 X X X 102
62 X X X 211 X X 132 X X X 871 X X X X X X X X
20 200 X 41 X X X X X X 122 X 81 11 X X X X X X
X X 210 X X 5 X X X X X X X X X 74 X X X X
X 95 X X X X 120 X X X 2 X X X X X X X X 11
X X 925 X X X X X X X X 121 X X X X X X X 653
X 81 X 90 X X X X X X X 219 X X X 211 X X X X
X X 11 X 98 X 122 390 X X X X X X X X 121 X 122 X
719 X X X X X X X 9 X X X X X X X 26 X X 832
X X 22 X X X X X 13 182 X X X X X X X X X 219
X X X X X 22 X X X X X X X X X X X X X X
X X X X X X X X X X 73 X X X X X X 98 X X
77 X X X X X X X 200 X 21 93 X X X X X X X 190
X X X X X X X 29 X 33 X X X X 33 940 X X X 121
X 322 X X 74 219 X X X 111 X X X X X X X X X X
X X X X X X X X X X X X X X X X X X X X
Вот мой код до сих пор:
public static void distance(){
ArrayList<String> path = new ArrayList<String>();
ArrayList<Integer> total = new ArrayList<Integer>();
int shortest = 10000; // temp value for testing
int temp;
int totalDistance = 0;
int shortNum = 0; // The city code for the next shortest path
String code = ""; //The city code
Scanner sc = new Scanner(System.in);
System.out.println("\nCity codes: ");
String d = sc.nextLine();
d = d.toUpperCase();
String[]command = d.split(" ");
if (command.length != 2){
System.out.println("You must enter 2 city codes.");
return;
}
String fromCity = command[0];
String toCity = command[1];
int fCity = find(fromCity);
int tCity = find(toCity);
fCity = fCity -1;
tCity = tCity -1;
int p = fCity;
String shortCode;
if (fCity == tCity){
System.out.println("The distance from " + cities[fCity][2] + " to " +
cities[tCity][2] + " is 0");
}
else {
while(shortNum != tCity){
for (int i = 0; i < 20; i ++){
if (roads[p][i] != "X"){
temp = Integer.parseInt(roads[p][i]);
if (temp < shortest){
shortest = temp;
shortNum = i;
code = cities[i][1];
System.out.println(code);
//p = i;
}
}
}
path.add(code);
total.add(shortest);
p = shortNum;
shortest = 10000;
}
System.out.println("The path is" + path);
for (int k = 0; k < total.size(); k ++){
totalDistance += total.get(k);
}
System.out.println("Total distance is " + totalDistance);
}
}
Для кратчайшего пути между городами 1 и 2 моя программа дает мне полную дистанцию 276. Идущий через 19, 5, 16, 11
Правильное решение - общее расстояние 225. Путь должен быть 19, 5, 9, 11
Может ли кто-нибудь увидеть, где я поступил не так?
Заранее благодарю за любую помощь.
Преднамеренно ли ваша матрица не симметрична? Этот график должен быть неориентирован (например, расстояние от 1-> 2 совпадает с 2-> 1). – Tim
Да, это намеренно. Предполагается представлять односторонние дороги между городами. Таким образом, a-> b! = B-> a или вообще не существует. – Neophyte
@ Неофит проверить мой ответ, чтобы описать, что вы сделали неправильно, а также рабочий код. – bcorso