reemplazar/eliminar ciclo en el gráfico
Frecuentes
Visto 182 veces
0
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
1 Respuestas
1
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 c algorithm graph or haz tu propia pregunta.