Думаю, можно обойтись обычным графом. Тянуть сюда БД - лишнее.
Структура узла:
Код:
TNode: record
Name: string;
Parents: Array of ^TNode;
Sons: Array of ^TNode;
end;
1. Заполняем массив (или список) жителей. Для каждого жителя ищем родителей. Потомки нам известны по условию задачи.
2. Собственно для решения все готово. Берем первого жителя и выбираем всех из списков Parents и Sons. После чего для каждого из них повторяем эту процедуру. Набирается список родственников 1-го жителя.
3. Повторяем пункт 2 для тех кто еще не попал в родственники.
4. и т.д.