Así que estoy leyendo los algoritmos de Robert Sedgewick 4a ed. el libro y los métodos para encontrar un ciclo en un gráfico dirigido son diferentes a los de encontrar un ciclo en un gráfico no dirigido.Encontrar un ciclo en un gráfico no dirigido versus encontrar uno en un gráfico dirigido
Aquí es código de ejemplo para encontrar un ciclo en un grafo no dirigido
public class Cycle {
public boolean[] marked;
public boolean hasCycle;
public Cycle(Graph G) {
marked = new boolean[G.V()]; // G.V() is the number of vertices in the graph G
for (int s = 0; s < G.V(); ++s) {
if (!marked[s])
dfs(G, s, s);
}
}
private void dfs(Graph G, int v, int u) {
marked[v] = true;
for (int w : G.adj(v)) //iterate through vertices adjacent to v
if (!marked[w])
dfs(G, w, v)
else if (w != u) hasCycle= true;
}
public boolean hasCycle() {
return hasCycle;
}
}
Sin embargo, cuando se trata de encontrar un ciclo en un grafo dirigido, Sedgewick utiliza un matriz booleana donde el elemento i-ésimo de esa matriz es cierto si el i-ésimo vértice se ha examinado durante la pila de llamadas actual. Para cada vértice K examinado, verificamos si el elemento Kth de la matriz booleana es verdadero. Si es así, entonces tenemos un ciclo. Mi pregunta es, ¿por qué es necesario usar esa matriz booleana para un gráfico dirigido. ¿No debería el enfoque que acabo de enumerar ser más eficiente con la memoria? ¿Y este enfoque solo funciona para gráficos no dirigidos? ¿por qué?
¿Puede suponer que podría haber un auto loop en el gráfico dirigido? – xvatar
Es sin asumir un auto-loop en realidad. Creo que el algoritmo que acabo de publicar podría funcionar para gráficos dirigidos, simplemente no estoy seguro – gooser
la respuesta a continuación tiene sentido. – xvatar