Avatar ·

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