Ciclos em uma árvore genealógica: como detectar e prevenir conexões inválidas?
Olá a todos! Estou escrevendo um programa para construir uma árvore genealógica em C++. Enfrentei o problema de quando o usuário acidentalmente cria um ciclo nas conexões (por exemplo, torna seu ancestral seu descendente). Isso quebra toda a lógica de exibição e cálculo de parentesco.
Eu tenho uma estrutura para o nó da árvore:
```cpp
struct Person {
string name;
Person* father;
Person* mother;
vector children;
};
```
Eu adiciono a conexão "pai-filho" através da função:
```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: não verifico se child não é um ancestral de parent
}
```
Como fazer a verificação de ciclos? Tentei uma simples comparação recursiva, mas com uma árvore grande (1000+ pessoas) fica muito lento. Talvez exista algum algoritmo ou padrão padrão para esses casos? Preciso que a verificação funcione