1 / 1 / 0
Регистрация: 10.03.2017
Сообщений: 30
Записей в блоге: 1
1

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

21.04.2017, 19:31. Показов 39916. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Условие
В генеалогическом древе у каждого человека, кроме родоначальника, есть ровно один родитель.

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

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

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

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

Примечание

Эта задача имеет решение сложности O(n), но вам достаточно написать решение сложности O(n2) (не считая сложности обращения к элементам словаря).
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2017, 19:31
Ответы с готовыми решениями:

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

Подсчет уровней вложенности меню
Добрый день Прошу помощи с запросом Есть две таблицы: -- -- Структура таблицы...

Подсчёт очков нескольких уровней игры
Есть игра, на несколько уровней, после прохождения каждого показываеться кол-во очков (те что...

Подсчет уровней в двоичном дереве поиска
каков алгоритм подсчета уровней в двоичном дереве поиска. спасибо.

Подсчет собранных предметов с разных уровней игры
Здравствуйте. Мне нужно реализовать подсчет всех собранных предметов на всех уровней. Чтобы в...

3
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
22.04.2017, 02:40 2
в чем затруднения?
0
1 / 0 / 1
Регистрация: 07.10.2019
Сообщений: 1
07.10.2019, 14:17 3
Лучший ответ Сообщение было отмечено Tra4nce как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
n=int(input())
 
p_tree={}                                       #это будет словарь {ребёнок=родитель}
 
#создаём словарь p_tree
for _ in range (1,n):                         #читаем строки
    line=input()
    child,parent=line.split()                #ребёнок,родитель = 'str1 str2'.split()
    p_tree[child]=parent                    #p_tree[ребёнок]='родитель'
 
#all_man = множество, все люди 
all_man=set(p_tree.keys())|set(p_tree.values()) #(все имена в единственном числе) = (все родители) + (все дети)
 
heights={}                                      #будет словарь {предок=поколение}
 
#вычисляет поколение, попутно создаёт словарь, чтоб не вычислять одно и тоже
def f(name):                                 #передаём имя 
    if name not in p_tree:                #если нет родителя
        heights[name]=0                  #предок = 0,запись в словарь heights 
        return 0                                #значение поколения для дальнейшего вычисления
    parent=p_tree[name]                 #родитель = смотрим в (ребёнок=родитель)
    if parent in heights:                    #если известно поколение родителя
        value=heights[parent]+1         #поколение = (поколение родителя)+1
    else:
        value=f(parent)+1                  #поколение = поколение родителя +1, имя родителя отдаём функции, она вернёт поколение родителя
    heights[name]=value                  #добавляем в словарь heights нового предка [имя] = поколение
    return value                                #значение поколения для дальнейшего вычисления
 
#создадим словарь (предок=поколение)
for name in all_man:                         #возьмем всех по очереди
    if name not in heights:                  #берём только тех, кого нет в словаре (предок=поколение)
        f(name)                                   #дать имени поколение попутно создавая словарь (предок-поколение)
        
for name in sorted(heights):
    print(name,heights[name])
 
#как новичёк запутался в сжатом коде решения, переписал
0
40 / 13 / 1
Регистрация: 06.12.2019
Сообщений: 429
19.01.2020, 01:52 4
Tra4nce,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
N = int(input())
d = {}
a = {}
 
for i in range(N-1):
    a1, a2 = input().split()
    d[a1] = a2
    a[a1] = 0
    a[a2] = 0
    
for i in d:
    s = i
    while s in d:
        s = d[s]
        a[i] += 1
    
for i in sorted(a):
    print(i, a[i])
2
19.01.2020, 01:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2020, 01:52
Помогаю со студенческими работами здесь

Задача в 5 уровней
Есть задача с 5 архивами,у кождого архива есть txt файл и новый архив,что бы открыть первый уровень...

Задача по гидравлике. Рассчитать профиль изменения уровней в заданном диапазоне
Изменение уровня h1 и h2 в двух последовательных проточных емкостей во времени определяется...

Родословная
Построение генеалогического древа на основе описания связей между членами семьи Входные данные:...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru