Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.33 KB | None | 0 0
  1. # Родословная: подсчет уровней
  2. n = int(input())  # кол. вводимых пар
  3. A = [tuple(input().split()) for i in range(n-1)]  # здесь находятся пары (предок, потомок)
  4. now_man = A[0][1]
  5. now_deep = 0
  6. B = {(0, now_man)}  # здесь будут храниться все люди с их глубиной нахождения (глубина, человек)
  7. no_child_mans = []  # люди, у которых нет непроверенных потомков
  8.  
  9. while True:  # главный цикл
  10.     have_parent_flag, have_child_flag = False, False
  11.     if now_man not in no_child_mans:  # эта проверка нужна, если мы перешли на уровень назад
  12.         for para in A:  # в этом цикле я ищу потомков, которых я не проверял
  13.             if para[1] == now_man and para[0] not in no_child_mans:
  14.                 now_deep += 1
  15.                 now_man = para[0]
  16.                 B.add((now_deep, now_man))
  17.                 have_parent_flag = True  # True - есть потомок, False - нет
  18.                 break
  19.     if not have_parent_flag:  # если нет потомков, которых я не проверял
  20.         now_deep -= 1  # иду на уровень назад
  21.         no_child_mans.append(now_man)  # добавляю человека в список людей, у которых я проверил всех потомков
  22.         for para in A:  # в этом цикле ищу его предка
  23.             if para[0] == now_man:
  24.                 now_man = para[1]
  25.                 have_child_flag = True
  26.                 break
  27.     else:  # если есть потомки
  28.         continue
  29.     if not have_child_flag:  # а если предков нет, то выхожу из главного цикла
  30.         break
  31.  
  32.  
  33. min_deep = 0  # самый первый now_man, которого мы взяли не обязательно был родоначальником
  34. for para in B:  # здесь я ищу минимальную глубину
  35.     if para[0] < min_deep:
  36.         min_deep = para[0]
  37. B = sorted(list(B), key=lambda x: x[1])  # сортирую по имени
  38. for man_data in B:
  39.     print(man_data[1], man_data[0] + min_deep)  # вывожу на экран
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement