Ciclos en el árbol genealógico: ¿cómo detectar y prevenir enlaces incorrectos?
¡Hola a todos! Estoy escribiendo un programa para construir un árbol genealógico en C++. Me encontré con el problema de que el usuario crea accidentalmente un ciclo en las relaciones (por ejemplo, hace que su antepasado sea su descendiente). Esto rompe toda la lógica de visualización y cálculo de parentesco.
Tengo una estructura para el nodo del árbol:
```cpp
struct Person {
string name;
Person* father;
Person* mother;
vector children;
};
```
Agrego una relación "padre-hijo" a través de una función:
```cpp
void addChild(Person* parent, Person* child) {
parent->children.push_back(child);
if (child->father == nullptr) child->father = parent;
else if (child->mother == nullptr) child->mother = parent;
// Problema: no verifico que child no sea un antepasado de parent
}
```
¿Cómo hacer una verificación de ciclos? Intenté una simple comparación recursiva, pero con un árbol grande (1000+ personas) es muy lento. ¿Quizás hay algún algoritmo estándar o patrón para estos casos? Necesito que la verificación funcione