Cómo encontrar qué vértices están en un ciclo de gráfico

p.ej. para 1->2, 2->3, 3->4, 4->2, quiero imprimir 2, 3, 4. Probé DFS, y cuando encontré el vértice que visité antes, voy al padre hasta que no obtenga este vértice, pero no funciona bien. A veces entra en un bucle infinito.

Ejecutar dfs:

int i;
for (i = 0; i < MAX_VER; i += 1)
    if (ver[i].v == 0 && ver[i].nb > 0)
        dfs(i);

df:

ver[v].v = 1;

int i;
for (i = 0; i < ver[v].nb; i += 1) {
    ver[ver[v].to[i]].p = v;

    if (ver[ver[v].to[i]].v == 0)
        dfs(ver[v].to[i]);
    else
        // cycle found
        printCycle(ver[v].to[i]);
}

y ciclo de impresión:

printf("\cycle: %d ", v);

int p = ver[v].p;

while (p != v) {
    printf("%d(%d) ", p, v);

    p = ver[p].p;
}

printf("\n");

Estructura de vértice:

int *to; // neighbor list

int nb; // how many neighbor
int p; // parent
short v; // was visited? 0 = false, 1 = true

preguntado el 03 de mayo de 12 a las 09:05

2 Respuestas

Parece que está buscando "Componentes fuertemente conectados", por lo que tiene suerte, existe un algoritmo bien conocido para encontrarlos en un gráfico. Ver Tarjan.

El algoritmo está bastante bien descrito en ese artículo, pero es un poco extenso, así que no lo pegaré aquí. Además, a menos que esté haciendo esto para estudiar, probablemente será mejor que use una implementación existente, no es que difícil de implementar pero no lo es que fácil tampoco.

EDITAR. Parece que esta pregunta es en realidad un engaño... me duele decir esto, pero probablemente deba cerrarse, lo siento. Ver El mejor algoritmo para detectar ciclos en un gráfico dirigido

contestado el 23 de mayo de 17 a las 13:05

Debe usar la coloración de vértices para evitar bucles infinitos en DFS. Al principio todos los vértices están marcados como BLANCOS. Cuando descubre un vértice por primera vez (está marcado como BLANCO), debe marcarlo como GRIS. Si descubriera un vértice GRIS, encontraría un bucle.

contestado el 03 de mayo de 12 a las 11:05

¿Y cómo te dice esto qué vértices están en el ciclo? - usuario395760

Puede usar std::map o std::unordered_map para contener el tipo de vértice. - Aligus

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.