Un ciclo ocurre cuando se regresa a un nodo por otro camino y se forma una vuelta completa. Detectar ciclos indica si un grafo puede recorrerse sin repetir aristas y es clave para tareas como ordenamiento topológico o validación de dependencias.
Un ciclo se detecta cuando en DFS encontramos un vecino ya visitado que no es el padre inmediato. Las aristas duplicadas o multigrafos requieren controles adicionales.
Abrir detector de ciclos en grafos no dirigidos
En digrafos, un ciclo se produce si alcanzamos un nodo que está en la pila de recursión (en proceso). El orden de visita importa y las aristas se siguen en su dirección.
Abrir detector de ciclos en grafos dirigidos
El arreglo en_recursion marca los nodos actualmente en la llamada recursiva. Si en DFS llegamos a un vecino con en_recursion[v] activo, hay ciclo dirigido.
v != padre.en_recursion puede ocultar ciclos posteriores.def dfs_no_dirigido(g, u, padre, visitado):
visitado[u] = True
for v, _ in g[u]:
if not visitado[v]:
if dfs_no_dirigido(g, v, u, visitado):
return True
elif v != padre:
return True
return False
def dfs_dirigido(g, u, visitado, en_recursion):
visitado[u] = True
en_recursion[u] = True
for v, _ in g[u]:
if not visitado[v]:
if dfs_dirigido(g, v, visitado, en_recursion):
return True
elif en_recursion[v]:
return True
en_recursion[u] = False
return False
def hay_ciclo_no_dirigido(g):
visitado = {v: False for v in g}
for u in g:
if not visitado[u]:
if dfs_no_dirigido(g, u, None, visitado):
return True
return False
def hay_ciclo_dirigido(g):
visitado = {v: False for v in g}
en_recursion = {v: False for v in g}
for u in g:
if not visitado[u]:
if dfs_dirigido(g, u, visitado, en_recursion):
return True
return False
El orden topológico es una lista lineal de los vértices de un digrafo acíclico (DAG) donde cada arista u → v respeta el orden: u va antes que v. Sirve para planificar tareas con dependencias o compilar módulos en secuencia. Solo existe si el grafo está libre de ciclos dirigidos.
Se puede obtener con DFS tomando los vértices en orden de finalización inverso, o con el algoritmo de Kahn (cola de nodos con grado de entrada cero). Si durante Kahn te quedas sin nodos y quedan aristas, hay un ciclo y el orden topológico no es posible.