Como detectar e prevenir ciclos em uma árvore genealógica em C++?
Olá a todos! Estou escrevendo um programa para construir uma árvore genealógica em C++. Enfrentei um problema sério: ao adicionar relações de parentesco, o usuário pode acidentalmente criar um ciclo. Por exemplo, indicar que o avô é neto do seu próprio neto. O programa trava ou cai com segmentation fault ao tentar percorrer a árvore.
Minha estrutura de dados é assim:
```cpp
struct Person {
string name;
vector parents;
vector children;
};
```
Eu adiciono a relação "pai-filho" mais ou menos assim:
```cpp
void addParentChild(Person* parent, Person* child) {
parent->children.push_back(child);
child->parents.push_back(parent);
}
```
O usuário insere os dados em ordem arbitrária, e não posso garantir que não surja um ciclo. Por exemplo, após várias operações, pode acontecer:
- A — pai de B
- B — pai de C
- C — pai de A (ciclo!)
Ao tentar um percurso recursivo para buscar ancestrais, o programa entra em um loop infinito.