У меня есть граф с городами как узлами и классом Flight как ребра. У каждого рейса есть время вылета, время прибытия, номер рейса и массив дней, в которые он выполняется. Несколько ребер могут соединять каждую пару узлов, делая граф мультиграфом. Мне нужно ответить на вопрос: Какие рейсы доступны из Place1 в Place2 в данный день и возможны пересадки?
Следующие два метода используют поиск в глубину для поиска и печати ответа:
public static void printRoutes(String day,String source,String place1, String place2, boolean[] visited, LinkedList<Edge> Route,Grafo g) {
int index = hash.get(place1);
visited[index] = true;
if (place1.equals(place2))
if (isTransferable(day,Route,source))
writeRoute(Route,source);
if (place1 != place2) {
LinkedList<Edge> adjs = g.adjs_no(place1);
for(Edge a: adjs) {
if (!visited[hash.get(a.node_final)]) {
Route.add(a);
printRoutes(day,source,a.node_final,place2,visited,Route,g);
Route.remove(a);
}
}
}
visited[indice] = false;
}
public static void writeRoute(LinkedList<Edge> Route,String source) {
System.out.print(source + " -> ");
for (int i = 0; i < Route.size(); i++) {
System.out.print(Route.get(i).vertex_final() + " | Flight Number:");
System.out.print(Route.get(i).flight.flightNumber + " | Departure Time:" + Route.get(i).flight.departureTime);
System.out.println();
if (i != Route.size()- 1)System.out.print(Route.get(i).vertex_final() + " -> ");
}
System.out.println();
System.out.println();
}
isTransferable проверяет, существует ли промежуток времени между прибытием и вылетом двух рейсов не менее 40 минут.
Я хотел бы ответить на этот вопрос, используя поиск в ширину вместо DFS, чтобы сначала появлялись более короткие поездки. Однако алгоритм, который у меня есть для BFS, не работает для мультиграфов. Есть ли способ выполнить BFS на этом графике, чтобы я мог успешно распечатать все возможные поездки между двумя городами в заданный день?




Важно понимать, что ваши данные не совсем образуют мультиграф для целей вашего алгоритма поиска маршрута. Это связано с тем, что исходящие ребра, которые можно пройти от данного узла, зависят от того, какое входящее ребро было пройдено, чтобы достичь этого узла. Вот почему вам нужен ваш метод isTransferable() для DFS.
Вместо этого то, что у вас есть, лучше было бы охарактеризовать как компактное представление обычного графа, в котором узлы представляют тройки (город, рейс прибытия, дата полета). Или, поскольку каждый рейс имеет ровно один пункт назначения, характеристические данные для каждого узла на самом деле представляют собой просто рейс и дату прибытия. Или, если вы разделите это на отдельные графики для каждого дня, у вас останется рейс прибытия, который будет характеристическими данными для каждого узла.
Имея это в виду, вы должны иметь возможность адаптировать обычный алгоритм BFS к вашему представлению данных. Ваш существующий метод isTransferable() может помочь, но ключ в том, чтобы правильно идентифицировать узлы (по входящему рейсу, а не (напрямую) по городу).