Найти тему
Соло путешествия

Задача «Родословная: подсчет уровней» Мое решение на Python 3

Задача «Родословная: подсчет уровней» Мое решение на Python 3.

Условие задачи:

В генеалогическом древе у каждого человека, кроме родоначальника, есть ровно один родитель.

Каждом элементу дерева сопоставляется целое неотрицательное число, называемое высотой. У родоначальника высота равна 0, у любого другого элемента высота на 1 больше, чем у его родителя.

Вам дано генеалогическое древо, определите высоту всех его элементов.

Программа получает на вход число элементов в генеалогическом древе N. Далее следует N−1 строка, задающие родителя для каждого элемента древа, кроме родоначальника. Каждая строка имеет вид имя_потомка имя_родителя.

Программа должна вывести список всех элементов древа в лексикографическом порядке. После вывода имени каждого элемента необходимо вывести его высоту.

https://pythontutor.ru/lessons/dicts/problems/genealogy_ancestors_and_descendants/

Мое решение:

n = int(input()) # число строк ввода

A = dict() # словарь входных данных

B = dict() # словарь имен

C = dict() # конечный словарь (решение задачи)

for i in range(n-1):

temp = input().split()

A[temp[0]] = temp[1]

# сформировали словарь входных данных

B[temp[0]] = 0

B[temp[1]] = 0

# сформировали словарь всех имеющихся имен

# для учета какие имена уже посчитаны

parents = A.values()

# сформировали список родителей

childrens = A.keys()

# сформировали список родителей

for name in parents:

# перебираем имена отцов

# находим 0-ое поколение

if name not in childrens:

C[name] = 0

del B[name]

break # т.к. по задаче всего один родоначальник,

# поэтому выходим из цикла

count_generation = 0 # счетчик поколений

while len(B) > 0 : # прерывание по пустому словарю B

for key, val in A.items():

# перебираем имена в исзодном словаре

# находим n-ое поколение (у них родитель только 0-ое поколение)

try:

if C[val] == count_generation:

C[key] = count_generation + 1

del B[key]

except KeyError: continue

# если указанного имени нет в словаре С, то берем

# следующую пару

count_generation += 1 # увеличиваем счетчик поколений

# конец цикла

output = sorted(C.items())

C = dict(output)

# сортируем словарь С в алфавитном порядке

for key, val in C.items():

print(key, val)

# выводим отсортированный словарь С на экран

Если есть вопросы - пишите в комментариях, с радостью отвечу.