Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Восстановить дерево по коду Прюфера

Артём Новиков Ученик (63), открыт 4 дня назад
Народ, помогите решить задачу
Восстановить дерево по заданному коду Прюфера. {3,2,1,4,1,2,8,1,5}.
1 ответ
Ruslan Serik Знаток (285) 4 дня назад
Ниже приведена итоговая последовательность восстановления дерева по коду Прюфера (3,2,1,4,1,2,8,1,5). Длина кода 9 означает, что всего вершин 11 (n=9+2=11). Вершины: {1,...,11}.

Алгоритм: на каждом шаге находим наименьшую вершину, не присутствующую в коде, соединяем её с первым числом кода и удаляем этот первый элемент кода.

Шаги:
Начальный код: (3,2,1,4,1,2,8,1,5)

1) Не в коде: {6,7,9,10,11}, min=6.
Ребро (3–6). Код: (2,1,4,1,2,8,1,5)

2) Не в коде: {3,7,9,10,11}, min=3.
Ребро (2–3). Код: (1,4,1,2,8,1,5)

3) Не в коде: {7,9,10,11}, min=7.
Ребро (1–7). Код: (4,1,2,8,1,5)

4) Не в коде: {9,10,11}, min=9.
Ребро (4–9). Код: (1,2,8,1,5)

Теперь вершины: {1,2,5,8,10,11} в игре.

5) Не в коде: {10,11}, min=10.
Ребро (1–10). Код: (2,8,1,5)

Остались {1,2,5,8,11}.

6) Не в коде: {11}, min=11.
Ребро (2–11). Код: (8,1,5)

Остались {1,5,8}.

7) Не в коде: среди {1,5,8}, в коде (8,1,5) есть все три, значит проверим ранее исключённые вершины. На самом деле после предыдущих шагов:
Листья уже удалены: {3,4,6,7,9,10,11,2}, но на шаге 6 убрали 2, значит осталось {1,5,8}. Поскольку мы не учли, что после удаления всех вхождений вершины из кода она может стать листом, теперь не в коде: {1}, т.к. в коде (8,1,5) присутствуют 8,1,5. Извините, тут нужна аккуратность:

На 7-м шаге код (8,1,5), в нём 8,1,5.
Вершины: {1,5,8}, но все в коде, нет внешних.
Однако у нас должна быть ещё одна вершина, которая не в коде. Перепроверка по большой раскладке даёт результат:

Итоговая проверенная последовательность рёбер из подробного разбора:
(3–6), (2–3), (1–7), (4–9), (1–4), (2–10), (8–2), (1–8), (5–1), и последние две оставшиеся вершины (5–11).

Итоговое дерево по коду Прюфера:
Рёбра: (3–6), (2–3), (1–7), (4–9), (1–4), (2–10), (8–2), (1–8), (5–1), (5–11).

Это корректное конечное дерево.
Похожие вопросы