Подойдет ли этот DFS подход для обнаружения циклов в направленном графике работает правильно, или есть скрытые проблемы?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Подойдет ли этот DFS подход для обнаружения циклов в направленном графике работает правильно, или есть скрытые проблемы?

Сообщение Anonymous »

Я пытаюсь обнаружить циклы на направленном графике, используя подход на основе DFS в Java. Я реализовал решение, которое использует посещаемый [] массив и строит карту из списка краев ввода. Похоже, что он работает правильно для всех тестовых случаев, которые я написал - даже для отключенных графиков и графиков с несколькими ветвями. Я хочу быть уверенным, что моя логика твердая, и если есть недостаток, я бы хотел понять это лучше. < /P>
public static boolean hasCycle(List edges, int v) {
boolean[] visited = new boolean[v];
Map map = new HashMap();

for (List list : edges) {
int parent = list.get(0);
List l = map.getOrDefault(parent, new ArrayList());
l.add(list.get(1));
map.put(parent, l);
}

for (int i = 0; i < v; i++) {
if (!visited && dfs(map, visited, i)) {
return true;
}
}

return false;
}

private static boolean dfs(Map map, boolean[] visited, int currentNode) {
if (visited[currentNode]) {
return true;
}

visited[currentNode] = true;

if (map.containsKey(currentNode)) {
for (Integer node : map.get(currentNode)) {
if (dfs(map, visited, node)) {
return true;
}
}
}

return false;
}
< /code>
Пример тестового примера < /p>
// Test Case 1 (should return true)
int v1 = 4;
List edges1 = Arrays.asList(
Arrays.asList(0, 1),
Arrays.asList(0, 2),
Arrays.asList(1, 2),
Arrays.asList(2, 0),
Arrays.asList(2, 3)
);
System.out.println("Case 1: " + hasCycle(edges1, v1)); // true

// Test Case 2 (should return false)
int v2 = 4;
List edges2 = Arrays.asList(
Arrays.asList(0, 1),
Arrays.asList(0, 2),
Arrays.asList(1, 2),
Arrays.asList(2, 3)
);
System.out.println("Case 2: " + hasCycle(edges2, v2)); // false

int v3 = 5;
List edges3 = List.of(
List.of(0, 1),
List.of(1, 2),
List.of(2, 0), // Cycle 1: 0 → 1 → 2 → 0
List.of(2, 3),
List.of(3, 4),
List.of(4, 2) // Cycle 2: 2 → 3 → 4 → 2
);

System.out.println("Case 2: " + hasCycle(edges3, v3)); // true

int v4 = 4;
List edges4 = Arrays.asList(
Arrays.asList(0, 1),
Arrays.asList(1, 2),
Arrays.asList(2, 3)
);
System.out.println("Case 4: " + hasCycle(edges4, v4)); // false

int v5 = 6;
List edges5 = Arrays.asList(
Arrays.asList(0, 1),
Arrays.asList(1, 2),
Arrays.asList(3, 4),
Arrays.asList(4, 5),
Arrays.asList(5, 3)
);
System.out.println("Case 5: " + hasCycle(edges5, v5)); // true

int v6 = 3;
List edges6 = Arrays.asList(
Arrays.asList(0, 1),
Arrays.asList(1, 2),
Arrays.asList(0, 2)
);
System.out.println("Case 6: " + hasCycle(edges6, v6)); // false

int v7 = 4;
// Graph: 0 → 1, 0 → 2, 1 → 3, 2 → 3 — no cycle
List edges7 = Arrays.asList(
Arrays.asList(0, 1),
Arrays.asList(0, 2),
Arrays.asList(1, 3),
Arrays.asList(2, 3)
);
System.out.println("Case 7 (no cycle, should be false): " + hasCycle(edges7, v7)); // false
< /code>
Я написал код самостоятельно и вручную создал различные тестовые примеры, включая графики с циклами, без циклов, отключенных графиков и графиков с несколькими путями к одному узлу. Во всех случаях вывод соответствовал моим ожиданиям. Я ожидал, что это будет правильно обнаружить циклы, но теперь я хочу подтвердить с сообществом - действительно ли этот метод надежным для направленных графиков? Если нет, может ли кто -нибудь предоставить контрпример?

Подробнее здесь: https://stackoverflow.com/questions/796 ... -correctly
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»