Если я могу сделать скромное предложение, которое может упростить кодирование: попробуйте создать класс City и Link, а затем создайте граф узлов вместо использования только списков.
Алгоритм Дейкстры - это алгоритм обхода графа,и если вы попробуете это просто с помощью массива, вы столкнетесь с некоторыми семантическими проблемами, разделяющими, какие значения представляют какие пути.(Глядя на метод ввода пути, он выглядит так, как будто вы уже)
Возможно, вы захотите создать несколько классов, таких как:
public class City {
String name;
List<Road> connectingRoads;
}
public class Road {
List<City> connectingCities;
Float distance;
Float price;
// Technically this COULD be for more than two cities... mainly I wrote it this way simply to make coding and use easier.
Road(Float distance, Float price, City... connectingCities) {
this.distance = distance;
this.price = price;
connectingCities = new ArrayList(connectingCities);
for (City city : connectingCities) {
city.connectingRoads.add(this);
}
}
}
Это даст вам фактическую структуру графа для обхода,и делает проблему семантического ввода намного менее проблематичной, так как вы можете искать города из массива, а затем добавлять дорогу на основе заданных входных значений.Обход графа затем выполняется путем просмотра списка connectRoads в каждой записи City.
Вы также хотите, чтобы еще один класс отслеживал ваши пути и затраты, найденные во время обхода графа, поскольку это является частью алгоритма Дейкстры.Хранение таких данных даже после нахождения кратчайшего пути очень помогло в случае программы бега по лабиринту, которую я написал в колледже.Мы использовали его для отображения самого быстрого пути от текущей точки в лабиринте, без каких-либо дополнительных вычислений, требуемых после однократного запуска алгоритма.Хотя, если честно, мы запустили алгоритм в обратном направлении от цели ко всем точкам в лабиринте - чтобы определить самую дальнюю точку - чтобы мы могли запустить игрока там> <</p>