Cómo detectar y prevenir ciclos en un árbol genealógico en C++
¡Hola a todos! Estoy escribiendo un programa para construir un árbol genealógico en C++. Me encontré con un problema grave: al agregar relaciones familiares, el usuario puede crear accidentalmente un ciclo. Por ejemplo, indicar que el abuelo es nieto de su propio nieto. El programa se cuelga o falla con segmentation fault al intentar recorrer el árbol.
Mi estructura de datos se ve así:
```cpp
struct Person {
string name;
vector parents;
vector children;
};
```
Agrego una relación "padre-hijo" más o menos así:
```cpp
void addParentChild(Person* parent, Person* child) {
parent->children.push_back(child);
child->parents.push_back(parent);
}
```
El usuario ingresa los datos en orden arbitrario, y no puedo garantizar que no surja un ciclo. Por ejemplo, después de varias operaciones podría obtenerse:
- A — padre de B
- B — padre de C
- C — padre de A (¡ciclo!)
Al intentar un recorrido recursivo para buscar antepasados, el programa entra en un bucle infinito.