У вас есть некоторые переменные, не объявленные в методе dfs
. Особенно в рекурсивных вызовах вы должны быть осторожны с тем, что должно быть объявлено как локальная переменная, что должно передаваться через параметры и что может быть объявлено как глобальная переменная stati c.
Ваша реализация отслеживания возврата dfs
неверна. Вы накапливаете все узлы, которые вы прошли в path
, а не путь к цели.
Вам необходимо изменить дизайн кода. Например, вместо возврата void ваша функция может возвращать логическое значение, если поиск будет успешным. Тогда вы можете решить не изменять path
больше. В качестве альтернативы ваша функция может вернуть path
цели.
Лучшая реализация для этого dfs
может быть:
public static boolean dfs(int source, int destination,
List<Integer> path,
List<Integer> graph[],
boolean vis[]) {
path.add(source);
if (source == destination) {
return true;
}
vis[source] = true;
if (!graph[source].isEmpty()) {
for (int j : graph[source]) {
if (!vis[j]) {
if (dfs(j, destination, path, graph, vis)) {
return true;
}
}
}
}
path.remove(path.size() - 1);
return false;
}