reemplazar/eliminar ciclo en el gráfico

Estoy tratando de reemplazar el ciclo en el gráfico a un grupo de vértices (elimine este ciclo y coloque allí una vez el vértice con el número máximo)

struct group {
    int master; // representative of cycle
};

struct vertex {
    int *to; // neighbor list

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

    struct group *cycle; // is part of cycle? NULL = no, else pointer to group
};

estoy ejecutando dfs en cada vértice

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

df:

void dfs(int v) {
    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
            replaceCycle(ver[v].to[i]);
    }
}

y reemplazar función gritar imprimir qué vértices están en ciclo

void replaceCycle(int v) {
    struct group *g = &gr[usedGroup++];
    g->master = -1;

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

    int p = ver[v].p;

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

        p = ver[p].p;
    }

    printf("\n");
}

Generalmente funciona, pero a veces obtiene un bucle infinito. Traté de depurarlo y si hay dos o más ciclos, los padres (p en la estructura de vértice) se pierden, significa que funciona bien pero hay un número incorrecto. Estoy aprendiendo C y algoritmos, así que no sé mucho de eso.

No es una tarea, es un problema de spoj

preguntado el 02 de mayo de 12 a las 19:05

1 Respuestas

Una vez que reemplace un ciclo, reinicie su dfs.

Básicamente, la bandera visitada puede estar configurada para su primer ciclo, pero querrá borrarla para probar su segundo ciclo. (Y tercero, y cuarto, etc.)

contestado el 02 de mayo de 12 a las 19:05

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